1. Django中的分页器
# urls.py
from django.conf.urls import url
from . import django_page
urlpatterns = [
url(r'^django_page/$', django_page.django_page),
]
# django_page.py
from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
data = []
for i in range(1, 100):
dic = {
'id': i,
'name': 'name{}'.format(i),
'content': 'content{}'.format(i),
}
data.append(dic)
def django_page(request):
per_page_num = 10
paginator = Paginator(data, per_page_num)
# paginator.per_page: 每页显示条目数量
# paginator.count: 数据总个数
# paginator.num_pages: 总页数
# paginator.page_range: 页码的列表(总页数的索引范围)
# paginator.page: page对象
url_path = request.path
current_page = request.GET.get('id', 1)
try:
current_page = int(current_page)
page_data = paginator.page(current_page)
# page_data.has_previous: 是否有上一页
# page_data.previous_page_number: 上一页页码
# page_data.has_next: 是否有下一页
# page_data.next_page_number: 下一页页码
# page_data.object_list: 分页之后的数据列表
# page_data.number: 当前页
# page_data.paginator: paginator对象
except PageNotAnInteger:
page_data = paginator.page(1)
except EmptyPage:
page_data = paginator.page(paginator.num_pages)
return render(request, "django_page.html", {"pageData": page_data, "paginator": paginator, "currentPage": current_page, "urlPath": url_path})
<!-- django_page.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7/css/bootstrap.min.css">
<title>django_page_title</title>
</head>
<body>
<div class="container">
<div class="row">
<h1>Django分页器</h1>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-condensed text-center">
<thead>
<tr>
<th>ID</th>
<th>NAME</th>
<th>CONTENT</th>
</tr>
</thead>
<tbody>
{% for i in pageData %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.name }}</td>
<td>{{ i.content }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div>
<nav aria-label="Page navigation">
<ul class="pagination pull-right">
{% if page_info.has_previous %}
<li class="previous"><a href="{{ urlPath }}?id={{ page_info.previous_page_number }}">上一页</a></li>
{% else %}
<li class="previous disabled"><a href="">上一页</a></li>
{% endif %}
{% for num in paginator.page_range %}
{% if num == currentPage %}
<li class="item active"><a href="{{ urlPath }}?id={{ num }}">{{ num }}</a></li>
{% else %}
<li class="item"><a href="{{ urlPath }}?id={{ num }}">{{ num }}</a></li>
{% endif %}
{% endfor %}
{% if page_info.has_next %}
<li class="next"><a href="{{ urlPath }}?id={{ page_info.next_page_number }}">下一页</a></li>
{% else %}
<li class="next disabled"><a href="">下一页</a></li>
{% endif %}
</ul>
</nav>
</div>
</div>
</div>
</body>
</html>
2. 自定义分页
# urls.py
from django.conf.urls import url
from . import views, page
urlpatterns = [
url(r'^data/$', page.show_page),
]
# page.py
from django.shortcuts import render
data = []
for i in range(1, 1009):
dic = {
'id': i,
'name': 'name{}'.format(i),
'content': 'content{}'.format(i),
}
data.append(dic)
def show_page(request):
# 获取页码
# get得到的结果都是字符串类型,需要转为int类型
# 如果传入的结果为空或者不是数字型的字符串,则赋值为1
page_num = request.GET.get('id')
if not page_num:
page_num = 1
elif not page_num.isdigit():
page_num = 1
else:
page_num = int(page_num)
# 每页显示的条数
per_page_num = 10
# 总数据条数
total_num = len(data)
# 总页数
total_page_num, modulo = divmod(total_num, per_page_num)
# 每页显示的条数不能被总数据条数整除,则总页数需要加1
if modulo:
total_page_num += 1
# 如果访问的页数大于总页数,则显示最后一页
if page_num > total_page_num:
page_num = total_page_num
# 如果显示页码的数量大于总页数,则当前页码数就等于总页码数
if most_show_num > total_page_num:
most_show_num = total_page_num
# 最多显示的页码个数
most_show_num = 7
# 显示当前页码的左右个数
show_num = int((most_show_num - 1) / 2)
# 第一个页码数字
page_begin_num = page_num - show_num
# 最后一个页码数字
page_end_num = page_num + show_num
# 如果当前页小于或等于页码左右的个数,则第一个页码数字是第一页的页码,最后一个页码数字是显示的页码个数
if page_num <= show_num:
page_begin_num = 1
page_end_num = most_show_num
# 如果当前页大于或等于总页数减去页码左右的个数,则第一个页码数字是总页数减去显示的页码个数,最后一个页码数字是最后一页的页码
if page_num >= total_page_num - show_num:
page_begin_num = (total_page_num - most_show_num) + 1
page_end_num = total_page_num
# 生成HTML标签
page_html_list = []
# 添加第一页按钮
if page_num - 1 <= 0:
page_html_tmp = '<li class="disabled"><a href="">prev</a></li>'
else:
page_html_tmp = '<li><a href="/data/?id={0}">prev</a></li>'.format(page_num - 1)
page_html_list.append(page_html_tmp)
# 添加首页按钮
page_html_tmp = '<li><a href="/data/?id=1">首页</a></li>'
page_html_list.append(page_html_tmp)
# 遍历显示的页码数据
for page in range(page_begin_num, page_end_num + 1):
if page == page_num:
page_html_tmp = '<li class="active"><a href="/data/?id={0}">{0}</a></li>'.format(page)
else:
page_html_tmp = '<li><a href="/data/?id={0}">{0}</a></li>'.format(page)
page_html_list.append(page_html_tmp)
# 添加尾页按钮
page_html_tmp = '<li><a href="/data/?id={0}">尾页</a></li>'.format(total_page_num)
page_html_list.append(page_html_tmp)
# 添加最后一页按钮
if page_num + 1 > total_page_num:
page_html_tmp = '<li class="disabled"><a href="">Next</a></li>'
else:
page_html_tmp = '<li><a href="/data/?id={0}">Next</a></li>'.format(page_num + 1)
page_html_list.append(page_html_tmp)
# 把页码数据标签拼接成字符串
page_html = ''.join(page_html_list)
# 生成数据
data_begin = (page_num - 1) * per_page_num
data_end = page_num * per_page_num
# 渲染前端页面
return render(request, 'page.html', {'data': data[data_begin:data_end], 'page_html': page_html})
<!-- page.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7/css/bootstrap.min.css">
<title>page_title</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="page-header">
<h1>数据分页显示
<small>每页显示10条数据</small>
</h1>
</div>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-condensed text-center">
<thead>
<tr>
<th>ID</th>
<th>NAME</th>
<th>CONTENT</th>
</tr>
</thead>
<tbody>
{% for i in data %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.name }}</td>
<td>{{ i.content }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div>
<nav aria-label="Page navigation">
<ul class="pagination pull-right pagination-lg">
{{ page_html|safe }}
</ul>
</nav>
</div>
</div>
</div>
</body>
</html>
3. 封装分页类,可永久导入使用
# urls.py
from django.conf.urls import url
from . import views, page
urlpatterns = [
url(r'^data/$', page.show_page),
]
# page.py
from django.shortcuts import render
from .page_obj import Page
data = []
for i in range(1, 1009):
dic = {
'id': i,
'name': 'name{}'.format(i),
'content': 'content{}'.format(i),
}
data.append(dic)
def show_page(request):
# 获取id值
page_num = request.GET.get('id')
# 获取数据总条数
total_num = len(data)
# 获取URL的路径
url_path = request.path
page_obj = Page(url_path, page_num, total_num)
return render(request, 'page.html', {'data': data[page_obj.begin:page_obj.end], 'page_html': page_obj.page_html})
# page_obj.py
class Page:
def __init__(self, url, page_num, total_num, per_page_num=10, most_show_num=7):
"""
定义分页相关的静态变量
:param url: 获取分页的url
:param page_num: 当前页面的页码
:param total_num: 数据的总条数
:param per_page_num: 每页显示的条数,默认显示10条
:param most_show_num: 最多显示的页码个数,默认为7个
"""
self.url = url
self.page_num = page_num
self.total_num = total_num
self.per_page_num = per_page_num
self.most_show_num = most_show_num
# 计算具体的总页数
self.total_page_num, modulo = divmod(self.total_num, self.per_page_num)
# 计算当前页码的左右个数
self.show_num = int((most_show_num - 1) / 2)
if modulo:
self.total_page_num += 1
# 获取有效的页码数,并转为int类型
if not page_num:
self.page_num = 1
elif not page_num.isdigit():
self.page_num = 1
else:
self.page_num = int(self.page_num)
# 如果当前页码大于总页数,则当前页码就是最后一页
if self.page_num > self.total_page_num:
self.page_num = self.total_page_num
# 如果显示页码的数量大于总页数,则当前页码数就等于总页码数
if self.most_show_num > self.total_page_num:
self.most_show_num = self.total_page_num
@property
def begin(self):
"""
:return: 数据切片的开始(包含)
"""
return (self.page_num - 1) * self.per_page_num
@property
def end(self):
"""
:return: 数据切片的结尾(不包含)
"""
return self.page_num * self.per_page_num
@property
def page_html(self):
"""
:return: 前端渲染页面的字符串
"""
# 第一个页码数字
page_begin_num = self.page_num - self.show_num
# 最后一个页码数字
page_end_num = self.page_num + self.show_num
# 小于左边时计算开始和结束的页码
if self.page_num <= self.show_num:
page_begin_num = 1
page_end_num = self.most_show_num
# 大于右边时计算开始和结束的页码
if self.page_num >= self.total_page_num - self.show_num:
page_begin_num = (self.total_page_num - self.most_show_num) + 1
page_end_num = self.total_page_num
page_html_list = []
# 第一页
if self.page_num - 1 <= 0:
page_html_tmp = '<li class="disabled"><a href="">prev</a></li>'
else:
page_html_tmp = '<li><a href="{0}?id={1}">prev</a></li>'.format(self.url, self.page_num - 1)
page_html_list.append(page_html_tmp)
# 首页
page_html_tmp = '<li><a href="{0}?id=1">首页</a></li>'.format(self.url)
page_html_list.append(page_html_tmp)
# 遍历
for page in range(page_begin_num, page_end_num + 1):
if page == self.page_num:
page_html_tmp = '<li class="active"><a href="{0}?id={1}">{1}</a></li>'.format(self.url, page)
else:
page_html_tmp = '<li><a href="{0}?id={1}">{1}</a></li>'.format(self.url, page)
page_html_list.append(page_html_tmp)
# 尾页
page_html_tmp = '<li><a href="{0}?id={1}">尾页</a></li>'.format(self.url, self.total_page_num)
page_html_list.append(page_html_tmp)
# 最后一页
if self.page_num + 1 > self.total_page_num:
page_html_tmp = '<li class="disabled"><a href="">Next</a></li>'
else:
page_html_tmp = '<li><a href="{0}?id={1}">Next</a></li>'.format(self.url, self.page_num + 1)
page_html_list.append(page_html_tmp)
return ''.join(page_html_list)
<!-- page.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7/css/bootstrap.min.css">
<title>page_title</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="page-header">
<h1>数据分页显示
<small>每页显示10条数据</small>
</h1>
</div>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-condensed text-center">
<thead>
<tr>
<th>ID</th>
<th>NAME</th>
<th>CONTENT</th>
</tr>
</thead>
<tbody>
{% for i in data %}
<tr>
<td>{{ i.id }}</td>
<td>{{ i.name }}</td>
<td>{{ i.content }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div>
<nav aria-label="Page navigation">
<ul class="pagination pull-right pagination-lg">
{{ page_html|safe }}
</ul>
</nav>
</div>
</div>
</div>
</body>
</html>
4. 学员管理系统分页版
项目描述
-
说明:简单实现学员管理系统后台的功能
-
角色:学员、老师、班级
-
学员功能:
-
显示学员列表
-
添加新学员
-
删除学员
-
编辑学员信息
-
可以根据不同条件搜索
-
老师功能:
-
显示老师列表
-
添加新老师
-
删除老师
-
编辑老师信息
-
可以根据不同条件搜索
-
班级功能:
-
显示班级列表
-
添加新班级
-
删除班级员
-
编辑班级信息
-
可以根据不同条件搜索
-
登录和欢迎页面:默认显示登录页面,登陆成功跳转欢迎页面
设计表结构
-- 创建数据库
create database day69 default charset=utf8;
use day69;
# 数据库配置
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'localhost',
'PORT': 3306,
'USER': 'yy',
'PASSWORD': '123',
'NAME': 'day69',
'charset': 'utf8',
}
}
# 静态文件配置
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
# 终端日志配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}
}
import pymysql
pymysql.install_as_MySQLdb()
from django.db import models
class User(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=50)
password = models.CharField(max_length=50)
class Class(models.Model):
id = models.AutoField(primary_key=True)
c_name = models.CharField(max_length=50)
class Student(models.Model):
id = models.AutoField(primary_key=True)
s_name = models.CharField(max_length=50)
c_id = models.ForeignKey(to='Class', to_field='id')
class Teacher(models.Model):
id = models.AutoField(primary_key=True)
t_name = models.CharField(max_length=50)
c_id = models.ManyToManyField(to='Class')
python manage.py makemigrations app
python manage.py migrate app
# 插入user表数据
for i in ['aaa', 'bbb', 'ccc', 'ddd']:
user_info = {'username': i, 'password': '123'}
models.User.objects.create(**user_info)
# 插入class表数据
for i in ['python1', 'python2', 'python3', 'linux1', 'linux2', 'linux3', 'java1', 'java2', 'java3']:
models.Class.objects.create(c_name=i)
# 插入老师表数据
for i in ['白眉鹰王', '紫杉龙王', '金毛狮王', '青翼蝠王', '天山童姥', '黄衫女子']:
models.Teacher.objects.create(t_name=i)
# 插入学生表数据
s_dic = [
{'s_name': '杨逍', 'c_id_id': '1'},
{'s_name': '范遥', 'c_id_id': '1'},
{'s_name': '张三', 'c_id_id': '2'},
{'s_name': '李四', 'c_id_id': '2'},
{'s_name': '王二', 'c_id_id': '3'},
{'s_name': '麻子', 'c_id_id': '3'},
{'s_name': '张无忌', 'c_id_id': '4'},
{'s_name': '令狐冲', 'c_id_id': '4'},
{'s_name': '乔峰', 'c_id_id': '4'},
{'s_name': '郭靖', 'c_id_id': '5'},
{'s_name': '杨过', 'c_id_id': '5'},
{'s_name': '石中玉', 'c_id_id': '6'},
{'s_name': '胡斐', 'c_id_id': '6'},
{'s_name': '韦小宝', 'c_id_id': '7'},
{'s_name': '袁承志', 'c_id_id': '7'},
{'s_name': '陈家洛', 'c_id_id': '7'},
]
for i in s_dic:
models.Student.objects.create(**i)
# 添加关联老师和班级表数据
models.Teacher.objects.get(id=1).c_id.add(*[1, 2, 3])
models.Teacher.objects.get(id=2).c_id.add(*[2,3,4,5])
models.Teacher.objects.get(id=3).c_id.add(*[4,5,6,7])
models.Teacher.objects.get(id=4).c_id.add(1)
models.Teacher.objects.get(id=5).c_id.add(5)
models.Teacher.objects.get(id=6).c_id.add(*[1,2,3,4,5,6,7,8])
系统配置
from django.conf.urls import url
from app.views import login, welcome, class_info, student_info, teacher_info
urlpatterns = [
url(r'^$', login.login),
url(r'^welcome/$', welcome.welcome, name='welcome'),
url(r'^class_list/$', class_info.class_list, name='class_list'),
url(r'^class_add/$', class_info.class_add, name='class_add'),
url(r'^class_edit/(?P<id>\d+)/$', class_info.class_edit, name='class_edit'),
url(r'^class_del/(?P<id>\d+)/$', class_info.class_del, name='class_del'),
url(r'^class_search/$', class_info.class_search, name='class_search'),
url(r'^student_list/$', student_info.student_list, name='student_list'),
url(r'^student_add/$', student_info.student_add, name='student_add'),
url(r'^student_edit/(?P<id>\d+)/$', student_info.student_edit, name='student_edit'),
url(r'^student_del/(?P<id>\d+)/$', student_info.student_del, name='student_del'),
url(r'^student_search/$', student_info.student_search, name='student_search'),
url(r'^teacher_list/$', teacher_info.teacher_list, name='teacher_list'),
url(r'^teacher_add/$', teacher_info.teacher_add, name='teacher_add'),
url(r'^teacher_edit/(?P<id>\d+)/$', teacher_info.teacher_edit, name='teacher_edit'),
url(r'^teacher_del/(?P<id>\d+)/$', teacher_info.teacher_del, name='teacher_del'),
url(r'^teacher_search/$', teacher_info.teacher_search, name='teacher_search'),
]
静态文件
/* style.css */
body {
margin-top: 50px;
background-color: #EEE;
}
#left {
font-size: 15px;
color: #FFF;
background-color: #EEE;
height: 100%;
position: fixed;
padding: 0;
}
.margin-top-20 {
margin-top: 20px;
}
.title {
background-color: #36363A;
height: 45px;
line-height: 45px;
padding-left: 10px;
}
.content div {
color: #5985B5;
padding: 10px 0 10px 20px;
font-weight: 900;
}
#search {
padding: 0;
}
.wel_content {
padding: 222px 0;
}
.wel_content > h1 {
font-size: 88px;
}
#login {
margin-top: 150px;
}
#err {
color: red;
font-weight: bolder;
margin-top: 50px;
}
.hide {
display: none;
}
// login.js
function userLogin() {
$("#index").on("click", function () {
var flag = true;
$(".form-control").each(function () {
$(this).on("focus", function () {
$(".text-danger").text("");
$(".form-group").removeClass("has-error");
});
var inputVal = $(this).val();
var textMsg = $(this).parent().prev().text();
if (inputVal.length === 0) {
$(this).next().text(textMsg + "不能为空");
$(this).parent().parent().addClass("has-error");
flag = false;
return flag;
} else if (inputVal.length < 2) {
$(this).next().text(textMsg + "格式不合法");
$(this).parent().parent().addClass("has-error");
flag = false;
return flag;
}
});
return flag;
})
}
$(function () {
userLogin();
});
// left_menu.js
function menuHide() {
$(".title").on("click", function () {
$(this).next(".content").toggleClass("hide");
$(this).parent().siblings().children(".content").addClass('hide');
});
}
$(function () {
menuHide();
});
分页对象文件
# page.py
class Page:
def __init__(self, url, page_num, total_num, per_page_num=10, most_show_num=7):
"""
定义分页相关的静态变量
:param url: 获取分页的url
:param page_num: 当前页面的页码
:param total_num: 数据的总条数
:param per_page_num: 每页显示的条数,默认显示10条
:param most_show_num: 最多显示的页码个数,默认为7个
"""
self.url = url
self.page_num = page_num
self.total_num = total_num
self.per_page_num = per_page_num
self.most_show_num = most_show_num
# 计算具体的总页数
self.total_page_num, modulo = divmod(self.total_num, self.per_page_num)
# 计算当前页码的左右个数
self.show_num = int((most_show_num - 1) / 2)
if modulo:
self.total_page_num += 1
# 获取有效的页码数,并转为int类型
if not page_num:
self.page_num = 1
elif not page_num.isdigit():
self.page_num = 1
else:
self.page_num = int(self.page_num)
# 如果当前页码大于总页数,则当前页码就是最后一页
if self.page_num > self.total_page_num:
self.page_num = self.total_page_num
# 如果显示页码的数量大于总页数,则当前页码数就等于总页码数
if self.most_show_num > self.total_page_num:
self.most_show_num = self.total_page_num
@property
def begin(self):
"""
:return: 数据切片的开始(包含)
"""
return (self.page_num - 1) * self.per_page_num
@property
def end(self):
"""
:return: 数据切片的结尾(不包含)
"""
return self.page_num * self.per_page_num
@property
def page_html(self):
"""
:return: 前端渲染页面的字符串
"""
# 第一个页码数字
page_begin_num = self.page_num - self.show_num
# 最后一个页码数字
page_end_num = self.page_num + self.show_num
# 小于左边时计算开始和结束的页码
if self.page_num <= self.show_num:
page_begin_num = 1
page_end_num = self.most_show_num
# 大于右边时计算开始和结束的页码
if self.page_num >= self.total_page_num - self.show_num:
page_begin_num = (self.total_page_num - self.most_show_num) + 1
page_end_num = self.total_page_num
page_html_list = []
# 第一页
if self.page_num - 1 <= 0:
page_html_tmp = '<li class="disabled"><a href="">prev</a></li>'
else:
page_html_tmp = '<li><a href="{0}?id={1}">prev</a></li>'.format(self.url, self.page_num - 1)
page_html_list.append(page_html_tmp)
# 首页
page_html_tmp = '<li><a href="{0}?id=1">首页</a></li>'.format(self.url)
page_html_list.append(page_html_tmp)
# 遍历
for page in range(page_begin_num, page_end_num + 1):
if page == self.page_num:
page_html_tmp = '<li class="active"><a href="{0}?id={1}">{1}</a></li>'.format(self.url, page)
else:
page_html_tmp = '<li><a href="{0}?id={1}">{1}</a></li>'.format(self.url, page)
page_html_list.append(page_html_tmp)
# 尾页
page_html_tmp = '<li><a href="{0}?id={1}">尾页</a></li>'.format(self.url, self.total_page_num)
page_html_list.append(page_html_tmp)
# 最后一页
if self.page_num + 1 > self.total_page_num:
page_html_tmp = '<li class="disabled"><a href="">Next</a></li>'
else:
page_html_tmp = '<li><a href="{0}?id={1}">Next</a></li>'.format(self.url, self.page_num + 1)
page_html_list.append(page_html_tmp)
return ''.join(page_html_list)
母板文件
<!-- base_list.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
{% load static %}
{% static "plugins/bootstrap-3.3.7/css/bootstrap.min.css" as bootstrap_css %}
{% static "css/style.css" as style_css %}
<link rel="stylesheet" href="{{ bootstrap_css }}">
<link rel="stylesheet" href="{{ style_css }}">
{% block title %}
{% endblock %}
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">学员管理系统</a>
</div>
<div class="collapse navbar-collapse navbar-right" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-left">
<li><a href="{% url 'student_list' %}">学员管理</a></li>
<li><a href="{% url 'teacher_list' %}">老师信息</a></li>
<li><a href="{% url 'class_list' %}">班级信息</a></li>
<li><a>设置</a></li>
<li><a>帮助</a></li>
</ul>
</div>
<form class="navbar-form navbar-right">
{% csrf_token %}
<div class="form-group">
<input type="text" class="form-control" placeholder="搜索...">
</div>
</form>
</div>
</nav>
<div class="container-fluid">
<div class="row">
<div id="left" class="col-md-2 col-sm-3 col-xs-2">
<div>
<div class="title margin-top-20">管理</div>
<div class="content hide">
<div><a href="{% url 'student_list' %}">学员管理</a></div>
<div><a href="{% url 'teacher_list' %}">老师管理</a></div>
<div><a href="{% url 'class_list' %}">班级管理</a></div>
<div>权限管理</div>
</div>
</div>
<div>
<div class="title">设置</div>
<div class="content hide">
<div>颜色设置</div>
<div>字体设置</div>
<div>界面设置</div>
<div>高级设置</div>
</div>
</div>
<div>
<div class="title">关于</div>
<div class="content hide">
<div>关于我们</div>
<div>联系我们</div>
<div>用户协议</div>
<div>版权所有</div>
</div>
</div>
</div>
{% block right_content %}
<div id="right"
class="col-md-offset-2 col-md-10 col-sm-offset-3 col-sm-9 col-xs-offset-2 col-xs-10 margin-top-20">
<div class="container-fluid">
<div class="panel panel-default">
<div class="panel-heading">
{% block panel_title %}
{% endblock %}
</div>
<div class="panel-body">
<div>
{% block search %}
{% endblock %}
</div>
<div>
{% block table %}
{% endblock %}
</div>
<div class="row">
<div class="col-md-7 col-xs-12 pull-right">
<ul class="pagination pagination-mg pull-right">
{{ page_html|safe }}
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
</div>
</div>
{% static "js/jquery-3.2.1.min.js" as jQuery_js %}
{% static "plugins/bootstrap-3.3.7/js/bootstrap.min.js" as bootstrap_js %}
{% static "js/left_menu.js" as left_js %}
<script src="{{ jQuery_js }}"></script>
<script src="{{ bootstrap_js }}"></script>
<script src="{{ left_js }}"></script>
</body>
</html>
<!-- base_other.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7/css/bootstrap.min.css">
{% block title %}
{% endblock %}
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-offset-4">
{% block content %}
{% endblock %}
</div>
</div>
</div>
</body>
</html>
登录页面
# login.py
from django.shortcuts import render, redirect
from django.urls import reverse
from app import models
# 显示登录页面
def login(request):
err_msg = ''
if request.method == 'POST':
# 获取提交的用户名和密码
name = request.POST.get('username')
pwd = request.POST.get('password')
# 判断用户名和密码
res_username_exist = models.User.objects.filter(username=name).exists()
res_check_user_pwd = models.User.objects.filter(username=name, password=pwd).exists()
if not res_username_exist:
err_msg = '用户名不存在'
elif not res_check_user_pwd:
err_msg = '用户名密码不正确'
else:
return redirect(reverse('welcome'))
return render(request, 'login.html', {'errMsg': err_msg})
<!-- login.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/css/style.css">
<title>登录页面</title>
</head>
<body>
<div class="container">
<div class="row">
<div id="login" class="col-md-4 col-md-offset-4 col-xs-8 col-xs-offset-2">
<h3 class="text-center">请登录</h3>
<form class="form-horizontal" action="" method="post">
{% csrf_token %}
<div class="form-group">
<label for="inputUsername" class="col-md-3 control-label">用户名</label>
<div class="col-md-9">
<input type="text" class="form-control" id="inputUsername" name="username"
placeholder="Username" autocomplete="off">
<div class="text-danger"></div>
</div>
</div>
<div class="form-group">
<label for="inputPassword" class="col-sm-3 control-label">密码</label>
<div class="col-sm-9">
<input type="password" class="form-control" id="inputPassword" name="password"
placeholder="Password" autocomplete="off">
<div class="text-danger"></div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9">
<div class="checkbox">
<label>
<input type="checkbox">记住我
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9">
<button id="index" type="submit" class="btn btn-primary btn-block">登录</button>
</div>
</div>
</form>
<div class="col-md-offset-2">
<h1 id="err">{{ errMsg }}</h1>
</div>
</div>
</div>
<script src="/static/js/jquery-3.2.1.min.js"></script>
<script src="/static/plugins/bootstrap-3.3.7/js/bootstrap.min.js"></script>
<script src="/static/js/login.js"></script>
</div>
</body>
</html>
欢迎页面
# welcome.py
from django.shortcuts import render
# 显示欢迎页面
def welcome(request):
return render(request, 'welcome.html')
<!-- welcome.html -->
{% extends 'base_list.html' %}
{% block title %}
<title>后台管理</title>
{% endblock %}
{% block right_content %}
<div id="right"
class="text-center text-primary col-md-offset-2 col-md-10 col-sm-offset-5 col-sm-9 col-xs-offset-2 col-xs-10 wel_content">
<h1 style="">欢 迎 来 到 管 理 后 台</h1>
</div>
{% endblock %}
班级的增删改查
# class_info.py
from django.shortcuts import render, redirect
from django.urls import reverse
from app import models
from app import page
# 显示班级信息
def class_list(request):
class_list_select = models.Class.objects.all().order_by('id')
page_num = request.GET.get('id')
total_num = len(class_list_select)
url_path = request.path
page_obj = page.Page(url_path, page_num, total_num)
return render(request, 'class/class_list.html', {'class_list': class_list_select[page_obj.begin:page_obj.end], 'page_html': page_obj.page_html})
# 添加班级
def class_add(request):
if request.method == 'POST':
# 获取新班级名称
new_class_name = request.POST.get('newClassName')
# 执行插入操作
models.Class.objects.create(c_name=new_class_name)
return redirect(reverse('class_list'))
return render(request, 'class/class_add.html')
# 编辑班级
def class_edit(request, id):
if request.method == 'POST':
# 获取修改后的班级名称
new_class_name = request.POST.get('newClassName')
# 执行修改操作
models.Class.objects.filter(id=id).update(c_name=new_class_name)
return redirect(reverse('class_list'))
# 获取需要修改班级的原数据显示到前端标签中
class_list_select = models.Class.objects.filter(id=id)
return render(request, 'class/class_edit.html', {'old_class_list': class_list_select[0]})
# 删除班级
def class_del(request, id):
# 执行删除操作
models.Class.objects.filter(id=id).delete()
return redirect(reverse('class_list'))
# 班级页面搜索功能
def class_search(request):
# 获取搜索的类型和搜索的内容
search_type = request.POST.get('searchType')
search_content = request.POST.get('searchContent')
# 根据不同的类型进行不同的查询
search_list = []
# 根据ID搜索进行等于查询
if search_type == 'id':
search_list = models.Class.objects.filter(id=search_content)
# 根据班级名称搜索进行模糊查询
elif search_type == 'c_name':
search_list = models.Class.objects.filter(c_name__icontains=search_content)
return render(request, 'class/class_list.html', {'class_list': search_list})
<!-- class_list.html -->
{% extends 'base_list.html' %}
{% block title %}
<title>班级信息</title>
{% endblock %}
{% block panel_title %}
<h3 class="panel-title">班级列表</h3>
{% endblock %}
{% block search %}
<form action="{% url 'class_search' %}" method="post" class="navbar-form navbar-left col-md-3">
{% csrf_token %}
<label>
<select class="form-control" name="searchType">
<option selected value="id">查找班级ID</option>
<option value="c_name">查找班级名称</option>
</select>
</label>
<div class="form-group">
<input name="searchContent" type="text" class="form-control"
placeholder="请输入班级ID或名称">
</div>
<button type="submit" class="btn btn-primary">搜索</button>
</form>
<div class="navbar-form navbar-right">
<a href="{% url 'class_add' %}" type="button" class="btn btn-success">添加</a>
</div>
{% endblock %}
{% block table %}
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>#</th>
<th>班级ID</th>
<th>班级名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for class in class_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ class.id }}</td>
<td>{{ class.c_name }}</td>
<td class="text-center">
<a href="{% url 'class_edit' class.id %}" class="btn btn-success btn-sm">
<span class="glyphicon glyphicon-pencil"></span>
编辑
</a>
<a href="{% url 'class_del' class.id %}" class="btn btn-danger btn-sm">
<span class="glyphicon glyphicon-trash"></span>
删除
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
<!-- class_add.html -->
{% extends 'base_other.html' %}
{% block title %}
<title>添加班级页面</title>
{% endblock %}
{% block content %}
<div class="page-header">
<h1>班级信息管理
<small>添加班级</small>
</h1>
</div>
<form action="{% url 'class_add' %}" method="post" class="navbar-form">
{% csrf_token %}
<div class="form-group">
<label>
<input name="newClassName" type="text" class="form-control" placeholder="新的班级名称">
</label>
</div>
<button type="submit" class="btn btn-success">确定</button>
<a href="{% url 'class_list' %}" type="button" class="btn btn-primary">取消</a>
</form>
{% endblock %}
<!-- class_edit.html -->
{% extends 'base_other.html' %}
{% block title %}
<title>编辑班级页面</title>
{% endblock %}
{% block content %}
<div class="page-header">
<h1>班级信息管理
<small>编辑班级</small>
</h1>
</div>
<form action="{% url 'class_edit' old_class_list.id %}" method="post" class="navbar-form">
{% csrf_token %}
<div class="form-group">
<label>
<input name="id" type="text" class="form-control hide" value="{{ old_class_list.id }}">
</label>
<p></p>
<label>
<input name="newClassName" type="text" class="form-control"
value="{{ old_class_list.c_name }}">
</label>
</div>
<p></p>
<button type="submit" class="btn btn-success">确定</button>
<a href="{% url 'class_list' %}" type="button" class="btn btn-primary">取消</a>
</form>
{% endblock %}
学员的增删改查
# student_info.py
from django.shortcuts import render, redirect
from django.urls import reverse
from app import models
# 显示学员信息
def student_list(request):
student_list_select = models.Student.objects.all().order_by('id')
page_num = request.GET.get('id')
total_num = len(student_list_select)
url_path = request.path
page_obj = page.Page(url_path, page_num, total_num)
return render(request, 'student/student_list.html', {'student_list': student_list_select[page_obj.begin:page_obj.end], 'page_html': page_obj.page_html})
# 添加学员
def student_add(request):
if request.method == 'POST':
# 获取新学员姓名和所在班级id
new_student_name = request.POST.get('newStudentName')
student_for_class_id = request.POST.get('studentForClass')
# 执行插入操作
models.Student.objects.create(s_name=new_student_name, c_id_id=student_for_class_id)
return redirect(reverse('student_list'))
# 查询班级信息列表用于select标签
class_list = models.Class.objects.all()
return render(request, 'student/student_add.html', {'class_list': class_list})
# 编辑学员
def student_edit(request, id):
if request.method == 'POST':
# 获取修改后的学员姓名和所在班级
new_student_name = request.POST.get('newStudentName')
student_for_class = request.POST.get('studentForClass')
# 执行修改操作
models.Student.objects.filter(id=id).update(s_name=new_student_name, c_id_id=student_for_class)
return redirect(reverse('student_list'))
# 获取需要修改学员的原数据显示到前端标签中
old_student_list = models.Student.objects.get(id=id)
class_list = models.Class.objects.all()
return render(request, 'student/student_edit.html', {'old_student_list': old_student_list, 'class_list': class_list})
# 删除学员
def student_del(request, id):
# 执行删除操作
models.Student.objects.filter(id=id).delete()
return redirect(reverse('student_list'))
# 学员页面搜索功能
def student_search(request):
# 获取搜索的类型和搜索的内容
search_type = request.POST.get('searchType')
search_content = request.POST.get('searchContent')
# 根据不同的类型进行不同的查询
search_list = []
# 根据ID搜索进行等于查询
if search_type == 'id':
search_list = models.Student.objects.filter(id=search_content)
# 根据学员姓名搜索进行模糊查询
elif search_type == 's_name':
search_list = models.Student.objects.filter(s_name__icontains=search_content)
# 根据所在班级搜索进行模糊查询
elif search_type == 'c_name':
class_list = models.Class.objects.filter(c_name__icontains=search_content)
search_list = models.Student.objects.filter(c_id_id__in=[i.id for i in class_list])
return render(request, 'student/student_list.html', {'student_list': search_list})
<!-- student_list.html -->
{% extends 'base_list.html' %}
{% block title %}
<title>学员信息</title>
{% endblock %}
{% block panel_title %}
<h3 class="panel-title">学员列表</h3>
{% endblock %}
{% block search %}
<form action="{% url 'student_search' %}" method="post" class="navbar-form navbar-left col-md-3">
{% csrf_token %}
<label>
<select class="form-control" name="searchType">
<option selected value="id">查找学员ID</option>
<option value="s_name">查找学员姓名</option>
<option value="c_name">查找学员班级</option>
</select>
</label>
<div class="form-group">
<input name="searchContent" type="text" class="form-control"
placeholder="请输入学员ID或名称">
</div>
<button type="submit" class="btn btn-primary">搜索</button>
</form>
<div class="navbar-form navbar-right">
<a href="{% url 'student_add' %}" type="button" class="btn btn-success">添加</a>
</div>
{% endblock %}
{% block table %}
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>#</th>
<th>学员ID</th>
<th>学员姓名</th>
<th>学员班级</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for student in student_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ student.id }}</td>
<td>{{ student.s_name }}</td>
<td>{{ student.c_id.c_name }}</td>
<td class="text-center">
<a href="{% url 'student_edit' student.id %}" class="btn btn-success btn-sm">
<span class="glyphicon glyphicon-pencil"></span>
编辑
</a>
<a href="{% url 'student_del' student.id %}" class="btn btn-danger btn-sm">
<span class="glyphicon glyphicon-trash"></span>
删除
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
<!-- student_add.html -->
{% extends 'base_other.html' %}
{% block title %}
<title>添加学员页面</title>
{% endblock %}
{% block content %}
<div class="page-header">
<h1>学员信息管理
<small>添加学员</small>
</h1>
</div>
<form action="{% url 'student_add' %}" method="post" class="navbar-form">
{% csrf_token %}
<div class="form-group">
<input name="newStudentName" type="text" class="form-control" placeholder="新的学员姓名">
</div>
<p></p>
<div>
<label>
<select class="form-control" name="studentForClass">
{% for class in class_list %}
<option value="{{ class.id }}">{{ class.c_name }}</option>
{% endfor %}
</select>
</label>
</div>
<p></p>
<button type="submit" class="btn btn-success">确定</button>
<a href="{% url 'student_list' %}" type="button" class="btn btn-primary">取消</a>
</form>
{% endblock %}
<!-- student_edit.html -->
{% extends 'base_other.html' %}
{% block title %}
<title>编辑学员页面</title>
{% endblock %}
{% block content %}
<div class="page-header">
<h1>学员信息管理
<small>编辑学员</small>
</h1>
</div>
<form action="{% url 'student_edit' old_student_list.id %}" method="post" class="navbar-form">
{% csrf_token %}
<div class="form-group">
<label>
<input name="id" type="text" class="form-control hide" value="{{ old_student_list.id }}">
</label>
<p></p>
<label>
<input name="newStudentName" type="text" class="form-control"
value="{{ old_student_list.s_name }}">
</label>
<div>
<label>
<select class="form-control" name="studentForClass">
{% for class in class_list %}
{% if old_student_list.c_id_id == class.id %}
<option value="{{ class.id }}" selected>{{ class.c_name }}</option>
{% else %}
<option value="{{ class.id }}">{{ class.c_name }}</option>
{% endif %}
{% endfor %}
</select>
</label>
</div>
</div>
<p></p>
<button type="submit" class="btn btn-success">确定</button>
<a href="{% url 'student_list' %}" type="button" class="btn btn-primary">取消</a>
</form>
{% endblock %}
老师的增删改查
# teacher_info.py
from django.shortcuts import render, redirect
from django.urls import reverse
from app import models
# 显示老师信息
def teacher_list(request):
teacher_to_class_list = models.Teacher.objects.all().order_by('id')
page_num = request.GET.get('id')
total_num = len(teacher_to_class_list)
url_path = request.path
page_obj = page.Page(url_path, page_num, total_num)
return render(request, 'teacher/teacher_list.html', {'teacher_to_class_list': teacher_to_class_list[page_obj.begin:page_obj.end], 'page_html': page_obj.page_html})
# 添加老师
def teacher_add(request):
if request.method == 'POST':
# 获取提交的老师姓名和所教班级
new_teacher_name = request.POST.get('newTeacherName')
teacher_for_class_id_list = request.POST.getlist('teacherForClass')
# 执行插入操作
new_teacher_obj = models.Teacher.objects.create(t_name=new_teacher_name)
new_teacher_obj.c_id.add(*teacher_for_class_id_list)
return redirect(reverse('teacher_list'))
# 查询班级信息列表用于select标签
class_list = models.Class.objects.all()
return render(request, 'teacher/teacher_add.html', {'class_list': class_list})
# 编辑老师
def teacher_edit(request, id):
teacher_class_list = models.Teacher.objects.get(id=id)
class_list = models.Class.objects.all()
if request.method == 'POST':
# 获取修改后的老师姓名和所教班级
new_teacher_name = request.POST.get('newTeacherName')
teacher_for_class_id_list = request.POST.getlist('teacherForClass')
# 执行修改操作
teacher_class_list.t_name = new_teacher_name
teacher_class_list.save()
teacher_class_list.c_id.set(teacher_for_class_id_list)
return redirect(reverse('teacher_list'))
# 获取需要修改老师的原数据显示到前端标签中
return render(request, 'teacher/teacher_edit.html', {'old_teacher_list': teacher_class_list, 'class_list': class_list})
# 删除老师
def teacher_del(request, id):
# 执行删除操作
models.Teacher.objects.filter(id=id).delete()
return redirect(reverse('teacher_list'))
# 老师页面搜索功能
def teacher_search(request):
# 获取搜索的类型和搜索的内容
search_type = request.POST.get('searchType')
search_content = request.POST.get('searchContent')
# 根据不同的类型进行不同的查询
search_list = []
# 根据ID搜索进行等于查询
if search_type == 'id':
search_list = models.Teacher.objects.filter(id=search_content)
# 根据老师姓名搜索进行模糊查询
elif search_type == 't_name':
search_list = models.Teacher.objects.filter(t_name__contains=search_content)
# # 根据所教班级搜索进行模糊查询
elif search_type == 'c_name':
search_list = models.Teacher.objects.filter(c_id__c_name__contains=search_content).distinct()
return render(request, 'teacher/teacher_list.html', {'teacher_to_class_list': search_list})
<!-- teacher_list.html -->
{% extends 'base_list.html' %}
{% block title %}
<title>老师信息</title>
{% endblock %}
{% block panel_title %}
<h3 class="panel-title">老师列表</h3>
{% endblock %}
{% block search %}
<form action="{% url 'teacher_search' %}" method="post" class="navbar-form navbar-left col-md-3">
{% csrf_token %}
<label>
<select class="form-control" name="searchType">
<option selected value="id">查找老师ID</option>
<option value="t_name">查找老师姓名</option>
<option value="c_name">查找老师班级</option>
</select>
</label>
<div class="form-group">
<input name="searchContent" type="text" class="form-control"
placeholder="请输入老师ID或名称">
</div>
<button type="submit" class="btn btn-primary">搜索</button>
</form>
<div class="navbar-form navbar-right">
<a href="{% url 'teacher_add' %}" type="button" class="btn btn-success">添加</a>
</div>
{% endblock %}
{% block table %}
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>#</th>
<th>老师ID</th>
<th>老师姓名</th>
<th>老师班级</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for teacher_to_class in teacher_to_class_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ teacher_to_class.id }}</td>
<td>{{ teacher_to_class.t_name }}</td>
<td>
{% for tc in teacher_to_class.c_id.all %}
{% if forloop.last %}
{{ tc.c_name }}
{% else %}
{{ tc.c_name }},
{% endif %}
{% endfor %}
</td>
<td class="text-center">
<a href="{% url 'teacher_edit' teacher_to_class.id %}" class="btn btn-success btn-sm">
<span class="glyphicon glyphicon-pencil"></span>
编辑
</a>
<a href="{% url 'teacher_del' teacher_to_class.id %}" class="btn btn-danger btn-sm">
<span class="glyphicon glyphicon-trash"></span>
删除
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
<!-- teacher_add.html -->
{% extends 'base_other.html' %}
{% block title %}
<title>添加老师页面</title>
{% endblock %}
{% block content %}
<div class="page-header">
<h1>老师信息管理
<small>添加老师</small>
</h1>
</div>
<form action="{% url 'teacher_add' %}" method="post" class="navbar-form">
{% csrf_token %}
<div class="form-group">
<input name="newTeacherName" type="text" class="form-control" placeholder="新的老师姓名">
</div>
<p></p>
<div>
<label>
<select class="form-control" name="teacherForClass" multiple>
{% for class in class_list %}
<option value="{{ class.id }}">{{ class.c_name }}</option>
{% endfor %}
</select>
</label>
</div>
<p></p>
<button type="submit" class="btn btn-success">确定</button>
<a href="{% url 'teacher_list' %}" type="button" class="btn btn-primary">取消</a>
</form>
{% endblock %}
<!-- teacher_edit.html -->
{% extends 'base_other.html' %}
{% block title %}
<title>编辑老师页面</title>
{% endblock %}
{% block content %}
<div class="page-header">
<h1>老师信息管理
<small>编辑老师</small>
</h1>
</div>
<form action="{% url 'teacher_edit' old_teacher_list.id %}" method="post" class="navbar-form">
{% csrf_token %}
<div class="form-group">
<label>
<input name="id" type="text" class="form-control hide" value="{{ old_teacher_list.id }}">
</label>
<p></p>
<label>
<input name="newTeacherName" type="text" class="form-control"
value="{{ old_teacher_list.t_name }}">
</label>
<div>
<label>
<select class="form-control" name="teacherForClass" multiple>
{% for class in class_list %}
{% if class in old_teacher_list.c_id.all %}
<option selected value="{{ class.id }}">{{ class.c_name }}</option>
{% else %}
<option value="{{ class.id }}">{{ class.c_name }}</option>
{% endif %}
{% endfor %}
</select>
</label>
</div>
</div>
<p></p>
<button type="submit" class="btn btn-success">确定</button>
<a href="{% url 'teacher_list' %}" type="button" class="btn btn-primary">取消</a>
</form>
{% endblock %}