一 前期准备:
1.创建Django项目
2.创建app
python manage.py startapp app01
3.修改配置文件
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', ] STATICFILES_DIRS=( os.path.join(BASE_DIR, 'static'), )
4.数据库设计:

from django.db import models # Create your models here. class Classes(models.Model): ''' 班级表 ''' title = models.CharField(max_length=32) m = models.ManyToManyField('Teachers') class Teachers(models.Model): ''' 教师表 ''' name=models.CharField(max_length=32) class Student(models.Model): ''' 学生表 ''' username = models.CharField(max_length=32) age = models.IntegerField() gender = models.BooleanField() cs = models.ForeignKey(Classes)
二 管理模块的实现:
1.班级管理(单表操作)
路由分发:

"""lin_day54 URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/3.0/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path from app01.views import classes urlpatterns = [ path('admin/', admin.site.urls), path('classes.html/', classes.get_classes), path('add_classes.html/', classes.add_classes), path('del_classes.html/', classes.del_classes), path('edit_classes.html/', classes.edit_classes), ]
模板Template:
主页面:
查:从数据库获取所有记录(QuerySet),locals()传递到前端,然后前端for循环显示所有记录

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <a href="/add_classes.html">添加</a> </div> <div> <table border="1"> <thead> <tr> <th>ID</th> <th>名称</th> <th>操作</th> </tr> </thead> <tbody> {% for i in cls_list %} <tr> <td>{{ i.id }}</td> <td>{{ i.title }}</td> <td> <a href="/del_classes.html?n_id={{ i.id }}">删除</a>| <a href="/edit_classes.html?n_id={{ i.id }}">编辑</a> </td> </tr> {% endfor %} </tbody> </table> </div> </body> </html>
增:点击添加,get方式请求返回一个add页面,输入要添加的班级,form表单post方式提交,后台添加班级

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/add_classes.html/" method="post"> {% csrf_token %} <input type="text" name="title" placeholder="请输入你要添加的班级"> <input type="submit"> </form> </body> </html>
改:点击编辑,get方式请求,返回一个edit页面,页面表单type='text'中显示原先的值,form表单post方式提交新的值到后台,后台update更新

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/edit_classes.html/?n_id={{ obj.id }}" method="post"> {% csrf_token %} {# <input type="text" name="id" value="{{ obj.id }}" style="display: none">#} <input type="text" name="title" value="{{ obj.title }}"> <input type="submit"> </form> </body> </html>
删:删除记录只需要传递要删除的id,可以不用有页面
视图函数:
查:显示所有记录:
def get_classes(request): cls_list = models.Classes.objects.all() return render(request,'get_classes.html',{'cls_list':cls_list})
增:
def add_classes(request): if request.method == "GET": return render(request,'add_classes.html') elif request.method == "POST": title = request.POST.get('title') models.Classes.objects.create(title=title) return redirect('/classes.html/')
删:
def del_classes(request): n_id = request.GET.get('n_id') print(n_id) models.Classes.objects.filter(id=n_id).delete() return redirect('/classes.html')
改:
def edit_classes(request): if request.method == "GET" : n_id = request.GET.get('n_id') obj = models.Classes.objects.filter(id=n_id).first() return render(request,'edit_classes.html',{"obj":obj}) elif request.method == 'POST': n_id = request.GET.get('n_id') title=request.POST.get('title') models.Classes.objects.filter(id=n_id).update(title=title) return redirect("/classes.html")
2.学员管理(一对多表操作)
路由分发:

path('students.html/', students.get_students), path('add_students.html/', students.add_students), path('del_students.html/', students.del_students), path('edit_students.html/', students.edit_students),
模板Template:
主页面:
查:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <a href="/add_students.html">添加</a> </div> <div> <table border="1"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>年龄</th> <th>性别</th> <th>班级</th> <th>操作</th> </tr> </thead> <tbody> {% for row in stu_list %} <tr> <td>{{ row.id }}</td> <td>{{ row.username }}</td> <td>{{ row.age }}</td> <td>{{ row.gender }}</td> <td>{{ row.cs.title }}</td> <td> <a href="/del_students.html/?n_id={{ row.id }}">删除</a> | <a href="/edit_students.html/?n_id={{ row.id }}">编辑</a> </td> </tr> {% endfor %} </tbody> </table> </div> </body> </html>
增:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>添加用户</h3> <form action="/add_students.html/" method="post"> {% csrf_token %} <p><input type="text" name="username" placeholder="用户名"></p> <p><input type="text" name="age" placeholder="年龄"></p> <p> 男:<input type="radio" name="gender" value="1"> 女:<input type="radio" name="gender" value="2"> </p> <p> <select name="cs"> {% for row in cs_list %} <option value="{{ row.id }}">{{ row.title }}</option> {% endfor %} </select> </p> <input type="submit" value="提交"> </form> </body> </html>
改:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>编辑用户</h3> <form action="/edit_students.html/?n_id={{ stu_obj.id }}" method="post"> {% csrf_token %} {# <p>ID :<input type="text" name="username" value="{{ stu_obj.id }}"></p>#} <p>姓名: <input type="text" name="username" value="{{ stu_obj.username }}"></p> <p>年龄: <input type="text" name="age" value="{{ stu_obj.age}}"></p> <p>性别: {% if stu_obj.gender %} 男:<input type="radio" name="gender" value='1' checked > 女:<input type="radio" name="gender" value='0'> {% else %} 男:<input type="radio" name="gender" value='1'> 女:<input type="radio" name="gender" value='0' checked > {% endif %} </p> <p> <select name="class_id"> {% for cls in cls_list %} {% if stu_obj.cs_id == cls.id %} <option value="{{ cls.id }}" selected>{{ cls.title }}</option> {% else %} <option value="{{ cls.id }}">{{ cls.title }}</option> {% endif %} {% endfor %} </select> </p> <p><input type="submit" value="提交"></p> </form> </body> </html>
删:删除记录只需要传递要删除的id,可以不用有页面
视图函数
查:
def get_students(request): stu_list = models.Student.objects.all() return render(request,'get_students.html',{'stu_list':stu_list})
增:
def add_students(request): if request.method == "GET": cs_list = models.Classes.objects.all() return render(request,'add_students.html',{'cs_list':cs_list}) elif request.method == "POST": username = request.POST.get("username") age = request.POST.get("age") gender = request.POST.get("gender") cs = request.POST.get("cs") models.Student.objects.create( username = username, age = age, gender = gender, cs_id = cs, ) return redirect('/students.html/')
删:
def del_students(request): n_id = request.GET.get('n_id') models.Student.objects.filter(id=n_id).delete() return redirect('/students.html/')
改:
def edit_students(request): if request.method == "GET": n_id = request.GET.get('n_id') stu_obj = models.Student.objects.filter(id=n_id).first() #stu_obj中有当前学生的信息 包括班级ID cs_id=1 cls_list = models.Classes.objects.values('id','title') #cls_list中有所有班级的信息 #ID 班级名称 #1 1班 selected #2 2班 return render(request,'edit_students.html',{'stu_obj':stu_obj,'cls_list':cls_list}) elif request.method == "POST": n_id = request.GET.get('n_id') user = request.POST.get('username') age = request.POST.get('age') gender = request.POST.get('gender') class_id = request.POST.get('class_id') models.Student.objects.filter(id=n_id).update(username=user,age=age,gender=gender,cs_id=class_id) return redirect('/students.html')
3 给班级分配教师(多对多操作)
在班级管理(单表操作)的基础上加多一个功能---->任课教师分配
路由分发:

path('classes.html/', classes.get_classes), path('add_classes.html/', classes.add_classes), path('del_classes.html/', classes.del_classes), path('edit_classes.html/', classes.edit_classes), path('set_teacher.html/', classes.set_teacher),
模板Template:
主页面:
查:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <a href="/add_classes.html">添加</a> </div> <div> <table border="1"> <thead> <tr> <th>ID</th> <th>名称</th> <th>任课教师</th> <th>操作</th> </tr> </thead> <tbody> {% for row in cls_list %} <tr> <td>{{ row.id }}</td> <td>{{ row.title }}</td> <td> {#在前端使用all等方法不需要加括号#} {% for item in row.m.all %} <span>{{ item.name }}</span> {% endfor %} </td> <td> <a href="/del_classes.html/?n_id={{ row.id }}">删除</a> | <a href="/edit_classes.html/?n_id={{ row.id }}">编辑</a> | <a href="/set_teacher.html/?n_id={{ row.id }}">分配老师</a> </td> </tr> {% endfor %} </tbody> </table> </div> </body> </html>
增:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/add_classes.html/" method="post"> {% csrf_token %} <input type="text" name="title" placeholder="请输入班级名称"> <input type="submit" value="提交"> </form> </body> </html>
改:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/edit_classes.html/?n_id={{ obj.id }}" method="POST"> {% csrf_token %} {# <input type="text" name="id" value="{{ obj.id }}" style="display: none"></input>#} <input type="text" name="title" value="{{ obj.title }}"> <input type="submit" value="提交"> </form> </body> </html>
删:删除记录只需要传递要删除的id,可以不用有页面
分配教师:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/set_teacher.html/?n_id={{ n_id }}" method="post"> {% csrf_token %} <select name="teacher_ids" multiple size="10" > {% for all_teacher in all_teacher_list %} {% if all_teacher.id in id_list %} <option value="{{ all_teacher.id }}" selected>{{ all_teacher.name }}</option> {% else %} <option value="{{ all_teacher.id }}">{{ all_teacher.name }}</option> {% endif %} {% endfor %} </select> <input type="submit" value="提交"> </form> </body> </html>
视图函数:
查:
def get_classes(request): cls_list = models.Classes.objects.all() # print(cls_list) return render(request,'get_classes.html',{'cls_list':cls_list})
增:
def add_classes(request): if request.method == 'GET': return render(request,'add_classes.html') elif request.method == 'POST': title = request.POST.get('title') models.Classes.objects.create(title=title) return redirect('/classes.html/')
删:
def del_classes(request): n_id = request.GET.get('n_id') models.Classes.objects.filter(id=n_id).delete() return redirect('/classes.html/')
改:
def edit_classes(request): if request.method == "GET": n_id = request.GET.get('n_id') obj = models.Classes.objects.filter(id=n_id).first() return render(request,'edit_classes.html',{'obj':obj}) elif request.method == 'POST': n_id = request.GET.get('n_id') title = request.POST.get('title') models.Classes.objects.filter(id=n_id).update(title=title) return redirect('/classes.html/')
教师分配:
def set_teacher(request): if request.method == 'GET': #获取当前要操作的记录的id n_id = request.GET.get('n_id') #获取id=n_id的班级对象 cls_obj = models.Classes.objects.filter(id=n_id).first() #获取该班级的所有教师的id与名称 cls_teacher_list = cls_obj.m.all().values_list('id','name') #获取该班级的所有教师的id,组成一个列表 id_list = list(zip(*cls_teacher_list))[0] if list(zip(*cls_teacher_list)) else [] #获取该学校的所有的教师 all_teacher_list = models.Teachers.objects.all() return render(request, 'set_teacher.html', { 'id_list':id_list, 'all_teacher_list':all_teacher_list, 'n_id':n_id } ) elif request.method == 'POST': n_id = request.GET.get('n_id') ids = request.POST.getlist('teacher_ids') print('当前班级的id',n_id) print('分配的教师id',ids) obj = models.Classes.objects.filter(id=n_id).first() obj.m.set(ids) return redirect('/classes.html')