day71---Django中的分页

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;
  • settings.py配置

    # 数据库配置
    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',
        },
    }
}
  • 配置django使用pymysql处理sql

    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
  • 把记录的sql语句执行到数据库

    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 %}
posted @ 2018-01-25 20:31  _岩哥  阅读(141)  评论(0)    收藏  举报