day68---Django模型系统二

1. ORM查询API

  • 返回QuerySet对象:

    • all():查询所有结果

    • filter(**kwargs):查询符合指定条件的结果

    • exclude(**kwargs):查询不符合指定条件的结果

    • values(*filed):以字典的形式返回指定字段查询的结果

    • values_list(*filed):以元组的形式返回指定字段查询的结果(字段值1, 字段值2)

    • order_by(*filed):排序(正序和反序使用负号区分)

      • order_by(filed):对查询结果正序排序
      • order_by(-filed):对查询结果反序排序
    • reverse(*filed):对查询结果进行反转(正序排序之后再次使用reverse之后的意义就是代表反序排序)

    • distinct(*filed):去除重复记录(查询的一个记录的所有数据代表一个参照记录,只有查询到的所有数据相同时才叫做重复,只要有一个字段的数据不是相同的,就不代表是重复的)

  • 返回具体的Object对象:

    • get(**kwargs):根据指定条件查询出一条匹配的结果,如果匹配的有多条或者没有记录都会报错

    • first():获取匹配结果的第一条数据

    • last():获取匹配结果的最后一条数据

  • 返回数字类型:

    • count():统计匹配到结果的数量

  • 返回布尔类型:

    • exists():判断QuerySet对象是否有数据,有则返回True,否则返回False

2. 双下划线之单表查询

  • 逻辑运算查询:

    • 过滤条件有多个使用逗号分割,每一个条件之间是逻辑与的关系
    • 使用exclude过滤条件是逻辑非的关系
  • 比较运算查询:

    • filter(filed='条件值'):查询的字段值等于指定条件值
    • exclude(filed='条件值'):查询的字段值不等于指定条件值
    • filter(filed__gt='条件值'):查询的字段值大于指定条件值
    • filter(filed__gte='条件值'):查询的字段值大于或等于指定条件值
    • filter(filed__lt='条件值'):查询的字段值小于指定条件值
    • filter(filed__lte='条件值'):查询的字段值小于或等于指定条件值
  • 成员运算查询:

    • filter(filed__in=['条件值1','条件值2','条件值3']):查询的字段值在指定条件值列表中(in的关系)
    • exclude(filed__in=['条件值1','条件值2','条件值3']):查询的字段值不在指定条件值列表中(not in的关系)
  • 区间范围查询filter(filed__range=['条件值1', '条件值2']):查询的字段值是指定条件值1和条件值2之间(between...and...的关系)

  • 模糊查询:

    • filter(filed__contains='条件值'):查询的字段值包含指定条件值,区分大小写
    • filter(filed__icontains='条件值'):查询的字段值包含指定条件值,忽略大小写
    • filter(filed__startswith='条件值'):查询的字段值以指定条件值开头,区分大小写
    • filter(filed__istartswith='条件值'):查询的字段值以指定条件值开头,忽略大小写
    • filter(filed__endswith='条件值'):查询的字段值以指定条件值结尾,区分大小写
    • filter(filed__iendswith='条件值'):查询的字段值以指定条件值结尾,忽略大小写
  • 正则表达式查询(filed__regex=r'正则表达式'):查询的字段值能匹配到指定的正则表达式

  • 日期和时间查询:(日期和时间查询可以使用所有的查询条件进行组合查询)

    • filter(filed__date=日期对象(年, 月, 日)):根据指定的日期查询
    • filter(filed__year=年):根据指定的年查询
    • filter(filed__month=月):根据指定的月查询
    • filter(filed__day=日):根据指定的日查询
    • filter(filed__week_day=星期):根据指定的星期查询
    • filter(filed__hour=时):根据指定的小时查询
    • filter(filed__minute=分):根据指定的分钟查询
    • filter(filed__second=秒):根据指定的秒数查询
  • 限制和偏移all()[n:m:o]:对查询结果进行切片,从n切到m,左包右不包含,o指定偏移量的值

  • 判断空值filter(filed__isnull=True):设置为True查询指定字段为null的数据,设置为False时查询指定字段不为null的数据

3. 通过logging模块显示出sql语句

在项目的settings.py中添加配置,可以把ORM执行的查询语句显示出对应的sql语句

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }

4. 学员管理系统ORM的ForeignKey版

项目描述

  • 说明:简单实现学员管理系统后台的功能

  • 角色:学员、老师、班级

  • 学员功能:

    • 显示学员列表
    • 添加新学员
    • 删除学员
    • 编辑学员信息
    • 可以根据不同条件搜索
  • 老师功能:

    • 显示老师列表
    • 添加新老师
    • 删除老师
    • 编辑老师信息
    • 可以根据不同条件搜索
  • 班级功能:

    • 显示班级列表
    • 添加新班级
    • 删除班级员
    • 编辑班级信息
    • 可以根据不同条件搜索
  • 登录和欢迎页面:默认显示登录页面,登陆成功跳转欢迎页面

设计表结构

  • 创建数据库

    -- 创建数据库
    create database day63 default charset=utf8;
    use day68;
  • 配置ORM

    • 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': 'day68',
                '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=20, unique=True)
        class Student(models.Model):
            id = models.AutoField(primary_key=True)
            s_name = models.CharField(max_length=20, unique=True)
            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=20, unique=True)
        class TeacherToClass(models.Model):
            id = models.AutoField(primary_key=True)
            t_id = models.ForeignKey(to='Teacher', to_field='id')
            c_id = models.ForeignKey(to='Class', to_field='id') 
    
    • 登记表结构修改记录

        python manage.py makemigrations app
    
    • 把记录的sql语句执行到数据库

        python manage.py migrate app
    
  • 添加表数据

	-- 添加数据
    insert into app_user (`username`, `password`) values
    ('aaa', '123'),
    ('bbb', '123'),
    ('ccc', '123'),
    ('ddd', '123');
    insert into app_class (`c_name`) values
    ('Linux一班'),
    ('Linux二班'),
    ('Linux三班'),
    ('Python一班'),
    ('Python二班'),
    ('Python三班'),
    ('Python四班');
    insert into app_teacher (`t_name`) values
    ('白眉鹰王'),
    ('紫杉龙王'),
    ('金毛狮王'),
    ('青翼蝠王'),
    ('天山童姥'),
    ('黄衫女子');
    insert into app_student (`s_name`, `c_id_id`) values
    ('杨逍', '1'),
    ('范遥', '1'),
    ('张三', '2'),
    ('李四', '2'),
    ('王二', '3'),
    ('麻子', '3'),
    ('张无忌', '4'),
    ('令狐冲', '4'),
    ('乔峰', '4'),
    ('郭靖', '5'),
    ('杨过', '5'),
    ('石中玉', '6'),
    ('胡斐', '6'),
    ('韦小宝', '7'),
    ('袁承志', '7'),
    ('陈家洛', '7');
    insert into app_teachertoclass (`c_id_id`, `t_id_id`) values
    ('1', '1'),
    ('1', '2'),
    ('1', '3'),
    ('2', '1'),
    ('2', '2'),
    ('2', '3'),
    ('2', '4'),
    ('3', '1'),
    ('3', '2'),
    ('3', '3'),
    ('3', '4'),
    ('4', '4'),
    ('5', '2'),
    ('5', '3'),
    ('5', '4'),
    ('6', '1'),
    ('6', '4'),
    ('7', '3'),
    ('6', '5'),
    ('2', '5'),
    ('6', '6');

系统配置

    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();
    });

母板文件

    <!-- 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">
										<nav aria-label="...">
											<ul class=" pull-right pagination">
												<li><a href="#" aria-label="Previous"><span
														aria-hidden="true">&laquo;</span></a></li>
												<li><a href="#">1</a></li>
												<li><a href="#">2</a></li>
												<li><a href="#">3</a></li>
												<li><a href="#">4</a></li>
												<li><a href="#">5</a></li>
												<li><a href="#" aria-label="Next"><span
														aria-hidden="true">&raquo;</span></a>
												</li>
											</ul>
										</nav>
									</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
	# 显示班级信息
	def class_list(request):
		class_list_select = models.Class.objects.all().order_by('id')
		print(class_list_select)
		return render(request, 'class/class_list.html', {'class_list': class_list_select})
	# 添加班级
	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')
		return render(request, 'student/student_list.html', {'student_list': student_list_select})
	# 添加学员
	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 reverse_data(data, field_name=None):
		dic = {}
		if field_name == 'c_name':
			for i in data:
				this_id = i.t_id.id
				if this_id not in dic:
					dic[this_id] = {'id': this_id, 't_name': i.t_id.t_name, 'tc_name_list': [i.c_id.c_name]}
				else:
					dic[this_id]['tc_name_list'].append(i.c_id.c_name)
		elif field_name == 'id':
			for i in data:
				this_id = i.t_id.id
				if this_id not in dic:
					dic[this_id] = {'id': this_id, 't_name': i.t_id.t_name, 'tc_id_list': [i.c_id.id]}
				else:
					dic[this_id]['tc_id_list'].append(i.c_id.id)
		return list(dic.values())
	# 显示老师信息
	def teacher_list(request):
		teacher_to_class_list = models.TeacherToClass.objects.all().order_by('id')
		teacher_to_class_list = reverse_data(teacher_to_class_list, 'c_name')
		return render(request, 'teacher/teacher_list.html', {'teacher_to_class_list': teacher_to_class_list})
	# 添加老师
	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)
			for i in teacher_for_class_id_list:
				models.TeacherToClass.objects.create(t_id_id=new_teacher_obj.id, c_id_id=i)
			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):
		if request.method == 'POST':
			# 获取修改后的老师姓名和所教班级
			new_teacher_name = request.POST.get('newTeacherName')
			teacher_for_class_id_list = request.POST.getlist('teacherForClass')
			# 执行修改操作
			models.Teacher.objects.filter(id=id).update(t_name=new_teacher_name)
			models.TeacherToClass.objects.filter(t_id_id=id).delete()
			for i in teacher_for_class_id_list:
				models.TeacherToClass.objects.create(t_id_id=id, c_id_id=i)
			return redirect(reverse('teacher_list'))
		# 获取需要修改老师的原数据显示到前端标签中
		teacher_class_list = models.TeacherToClass.objects.filter(t_id_id=id)
		teacher_class_list = reverse_data(teacher_class_list, 'id')[0]
		class_list = models.Class.objects.all()
		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.TeacherToClass.objects.filter(t_id_id=search_content)
		# 根据老师姓名搜索进行模糊查询
		elif search_type == 't_name':
			search_list = models.TeacherToClass.objects.filter(t_id__t_name__icontains=search_content)
		# 根据所教班级搜索进行模糊查询
		elif search_type == 'c_name':
			search_list = models.TeacherToClass.objects.filter(c_id__c_name__icontains=search_content)
		search_list = reverse_data(search_list, 'c_name')
		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_name in teacher_to_class.tc_name_list %}
							{% if forloop.last %}
								{{ tc_name }}
							{% else %}
								{{ tc_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.id in old_teacher_list.tc_id_list %}
    								<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-22 16:56  _岩哥  阅读(121)  评论(0)    收藏  举报