一 前期准備:
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')