项目准备
创建项目
django-admin startproject Mydjango
cd Mydjango
python manage.py startapp APP
项目架构
Mydjango
APP
migrations
0001_initial.py
static
style.css
templates
index.html [首页入口页面]
add_classes.html [添加班级页面]
add_students.html [添加学生页面]
add_teachers.html [添加老师页面]
edit_classes.html [编辑班级页面]
edit_students.html [编辑学生页面]
edit_teachers.html [编辑老师页面]
get_classes.html [班级展示页面]
get_students.html [学生展示页面]
get_teachers.html [老师展示页面]
set_teacher.html [班级分配老师页面]
views
index.py [首页视图]
classes.py [班级视图]
students.py [学生视图]
teachers.py [老师视图]
admin.py
apps.py
models.py
tests.py
Mydjango
settings.py
urls.py
wsgi.py
db.sqlite3
manage.py
static
style.css
*{margin: auto;}
a,table {text-decoration:none; padding: 10px}
thead {font-size: 18px;}
table {border-spacing:0;border-collapse:collapse;background:lightskyblue; text-align: center;margin-top: 20px;}
table > th,td{padding: 5px 20px;}
.list_top{width: 200px; font-size: 30px;font-weight:bold;margin-top: 30px;}
templates
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生管理系统</title>
<style>
*{margin: auto;text-align: center;}
h1{margin-top: 10%;margin-bottom: 30px;}
div{margin-top: 50px;}
div>a {text-decoration:none;margin: 10px;padding: 15px;background: lightskyblue;border-radius:10px; -moz-border-radius:10px;}
</style>
</head>
<body>
<h1>PythonDjango框架练习-学生管理系统</h1>
<div>
<a href="classes.html">班级展示页面</a>
<a href="teachers.html">老师展示页面</a>
<a href="students.html">学生展示页面</a>
</div>
</body>
</html>
add_classes.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加班级</title>
</head>
<body>
<form action="add_classes.html" method="POST">
{% csrf_token %}
<input type="text" name="title"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
add_students.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加学生</title>
</head>
<body>
<form action="/add_students.html" method="POST">
{% csrf_token %}
<p><input type="text" name="username" placeholder="姓名" value=""/></p>
<p><input type="text" name="age" placeholder="年龄"/></p>
<p>
男:<input type="radio" name="gender" value="1">
女:<input type="radio" name="gender" value="0">
</p>
<p>
<select name="cs">
<!--循环显示班级列表id和名称-->
{% for row in cs_list %}
<option value="{{ row.id }}">{{ row.titile }}</option>
{% endfor %}
</select>
</p>
<input type="submit" value="提交"/>
</form>
</body>
</html>
add_teachers.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加老师</title>
</head>
<body>
<form action="/add_teachers.html" method="POST">
{% csrf_token %}
<p><input type="text" name="name" placeholder="姓名"/></p>
<p><input type="text" name="age" placeholder="年龄"/></p>
<p>
男:<input type="radio" name="gender" value="1">
女:<input type="radio" name="gender" value="0">
</p>
<input type="submit" value="提交"/>
</form>
</body>
</html>
edit_classes.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编辑班级</title>
</head>
<body>
<!--将id和修改数值一并提交-->
<form method="POST" action="/edit_classes.html">
{% csrf_token %}
<!-- value值为后台查询到的对象[需要编辑的id和值] -->
<input type="text" name="id" value="{{ obj.id }}" style="display: none"/>
<input type="text" name="con" value="{{ obj.titile }}"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
edit_students.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编辑学生</title>
</head>
<body>
<form action="/edit_students.html" method="POST">
{% csrf_token %}
<p style="display: none">
<!--隐藏id项-->
<input typpe="text" name="nid" value="{{ obj.id }}">
</p>
<p><input type="text" name="username" placeholder="姓名" value="{{ obj.username }}"/></p>
<p><input type="text" name="age" placeholder="年龄" value="{{ obj.age }}"/></p>
<p>
{% if obj.gender %}
<!--判断性别单选项-->
男:<input type="radio" name="gender" value="1" checked="checked"/>
女:<input type="radio" name="gender" value="0" />
{% else %}
男:<input type="radio" name="gender" value="1" />
女:<input type="radio" name="gender" value="0" checked="checked"/>
{% endif %}
</p>
<p>
<select name="cs_list">
<!--循环班级列表-->
{% for row in cs_list %}
<!--循环判断原有的id和名称-->
{% if row.id == obj.cs_id %}
<option value="{{ row.id }}" selected="selected">{{ row.titile }}</option>
{% else %}
<option value="{{ row.id }}" >{{ row.titile }}</option>
{% endif %}
{% endfor %}
</select>
</p>
<input type="submit" value="提交"/>
</form>
</body>
</html>
edit_teachers.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编辑老师</title>
</head>
<body>
<form action="/edit_teachers.html" method="POST">
{% csrf_token %}
<p style="display: none">
<!--隐藏id项-->
<input typpe="text" name="nid" value="{{ obj.id }}">
</p>
<p><input type="text" name="name" placeholder="姓名" value="{{ obj.name }}"/></p>
<p><input type="text" name="age" placeholder="年龄" value="{{ obj.age }}"/></p>
<p>
{% if obj.gender %}
<!--判断性别单选项-->
男:<input type="radio" name="gender" value="1" checked="checked"/>
女:<input type="radio" name="gender" value="0" />
{% else %}
男:<input type="radio" name="gender" value="1" />
女:<input type="radio" name="gender" value="0" checked="checked"/>
{% endif %}
</p>
<input type="submit" value="提交"/>
</form>
</body>
</html>
get_classes.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>班级页面</title>
<link href="static/style.css" rel="stylesheet">
</head>
<body>
<div class="list_top">
<a href="add_classes.html">添加班级</a>
</div>
<table border="1">
<thead>
<th>序列号</th>
<th>名称</th>
<th>任课老师</th>
<th>操作</th>
</thead>
<tbody>
{% for row in cls_list %}
<!--循环班级列表-->
<tr>
<td>
{{ row.id }}
<!--获取班级列表id字段-->
</td>
<td>
{{ row.titile }}
<!--获取班级列表title字段-->
</td>
<td>
<!--{{ row.m.all }}为当前班级所有任课老师的对象,循环并取老师名字展示【和分配页面取法略有差异】-->
{% for item in row.m.all %}
<span>{{ item.name }}</span>
{% endfor %}
</td>
<th>
<!--传参数nid={{row.id}}到后端,避免使用全局id-->
<a href="/edit_classes.html?nid={{ row.id }}">编辑</a>|
<a href="/del_classes.html?nid={{ row.id }}">删除</a>|
<a href="/set_teacher.html?nid={{ row.id }}">分配老师</a>
</th>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
get_students.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生页面</title>
<link href="static/style.css" rel="stylesheet">
</head>
<body>
<div class="list_top">
<a href="add_students.html">添加学生</a>
</div>
<table border="1">
<thead>
<th>序列号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>班级</th>
<th>操作</th>
</thead>
<tbody>
{% for row in stu_list %}
<!--循环学生列表-->
<tr>
<td>
{{ row.id }}
<!--获取学生列表id字段-->
</td>
<td>
{{ row.username }}
<!--获取学生列表姓名字段-->
</td>
<td>
{{ row.age }}
<!--获取学生列表年龄字段-->
</td>
<td>
<!--根据布尔值判断性别-->
{% if row.gender == True %}
男
{% else %}
女
{% endif %}
<!--获取学生列表性别字段-->
</td>
<td>
{{ row.cs.titile }}
<!--获取学生列表班级字段-->
</td>
<th>
<!--传参数nid={{row.id}}到后端,避免使用全局id-->
<a href="/edit_students.html?nid={{ row.id }}">编辑</a>|
<a href="/del_students.html?nid={{ row.id }}">删除</a>
</th>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
get_teachers.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>老师页面</title>
<link href="static/style.css" rel="stylesheet">
</head>
<body>
<div class="list_top">
<a href="add_teachers.html">添加老师</a>
</div>
<table border="1">
<thead>
<th>序列号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>操作</th>
</thead>
<tbody>
{% for row in tea_list %}
<!--循环老师列表-->
<tr>
<td>
{{ row.id }}
<!--获取老师列表id字段-->
</td>
<td>
{{ row.name }}
<!--获取老师列表姓名字段-->
</td>
<td>
{{ row.age }}
<!--获取老师列表年龄字段-->
</td>
<td>
<!--根据布尔值判断性别-->
{% if row.gender == True %}
男
{% else %}
女
{% endif %}
<!--获取老师列表性别字段-->
</td>
<th>
<!--传参数nid={{row.id}}到后端,避免使用全局id-->
<a href="/edit_teachers.html?nid={{ row.id }}">编辑</a>|
<a href="/del_teachers.html?nid={{ row.id }}">删除</a>
</th>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
set_teacher.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分配老师</title>
</head>
<body>
<form method="POST" action="/set_teacher.html?nid={{ nid }}">
{% csrf_token %}
<p>当前班级老师:
{% for itum in cs_tea_list %}
{{ itum }}
{% endfor %}
</p>
<p>
<strong>需要修改请在以下栏目中选择并提交【支持多选】</strong>
</p>
<select multiple name="teacher_ids">
{% for item in all_teacher_list %}
{% if item in all_reacher_list %}
<option value="{{ item.id }}" selected="selected">{{ item.name }}</option>
{% else %}
<option value="{{ item.id }}">{{ item.name }}</option>
{% endif %}
{% endfor %}
</select>
<input type="submit" value="提交">
</form>
</body>
</html>
views
classes.py
# -*- coding:utf8 -*-
from django.shortcuts import render,redirect
from APP import models
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": #判断提交方式是否为GET
return render(request, 'add_classes.html') #返回添加页面
elif request.method == "POST": #判断提交方式是否为POST
title = request.POST.get('title') #获取班级名称
models.Classes.objects.create(titile=title) #创建新的班级
return redirect('/classes.html') #返回班级列表
def del_classes(request): #删除班级
nid = request.GET.get('nid') #获取要删除的班级id
models.Classes.objects.filter(id=nid).delete() #删除班级
return redirect('/classes.html') #返回班级列表
def edit_classes(request): #编辑班级
if request.method == "GET": #判断提交方式是否为GET
nid = request.GET.get('nid') #获取编辑列的id
obj = models.Classes.objects.filter(id=nid).first() #获取编辑列的值
return render(request,'edit_classes.html',{'obj':obj}) #返回编辑页面,并附加要修改的值
elif request.method == "POST": #判断提交方式是否为POST
nid = request.POST.get("id") #获取编辑列的id
title = request.POST.get("con") #获取编辑列的名称
models.Classes.objects.filter(id=nid).update(titile=title) #更新数据
return redirect('/classes.html') #返回班级页面
def set_teacher(request):
if request.method == 'GET':
nid = request.GET.get('nid') #获取当前要分配老师的班级id
all_teacher_list = models.Teachers.objects.all() #获取所有老师
cls_obj = models.Classes.objects.filter(id=nid).first() #获取班级id对应的对象
print("班级ID对象",cls_obj)
cs_tea_list=cls_obj.m.all() #获取当前班级的老师
print("当前班级老师,不带ID用于展示",cs_tea_list)
cls_teacher_list = cls_obj.m.all().values_list('id','name') #获取当前班级老师的id和姓名,班级对象多对多关系正向查询
print("当前班级老师带ID,用于查询和选择", cls_teacher_list)
id_list = list(zip(*cls_teacher_list))[0] if list(zip(*cls_teacher_list)) else [] #zip格式化函数进行压缩格式化便于取值
print("当前班级老师ID",id_list)
return render(request,'set_teacher.html', #返回当前班级的老师和所有老师
{
'cls_teacher_list':id_list,
'all_teacher_list':all_teacher_list,
'nid':nid,
"cs_tea_list":cs_tea_list
})
elif request.method == "POST":
nid = request.GET.get('nid') #当前编辑修改的ID
print("当前编辑修改的ID",nid)
ids = request.POST.getlist('teacher_ids') #分配的老师ID
print("当前分配的老师ID",ids)
obj = models.Classes.objects.filter(id=nid).first() #获取班级id对应的对象
obj.m.set(ids) #修改分配老师
return redirect('/classes.html')
index.py
# -*- coding:utf8 -*-
from django.shortcuts import render,redirect
from APP import models
def portal(request):
return render(request, 'index.html')
students.py
# -*- coding:utf8 -*-
from django.shortcuts import render,redirect
from APP import models
def get_students(request): #学生信息展示
stu_list = models.Students.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': #判断提交方式
u = request.POST.get('username') #获取填写姓名
a = request.POST.get('age') #获取填写年龄
g = request.POST.get('gender') #获取选择性别
c = request.POST.get('cs') #获取选择班级
#获取的字段内容添加到数据库
models.Students.objects.create(
username=u,
age=a,
gender=g,
cs_id=c
)
return redirect('/students.html') #跳转到学生信息页面
def del_students(request): #学生信息删除
nid = request.GET.get('nid') #获取要删除的学生id
models.Students.objects.filter(id=nid).delete() #删除选中学生
return redirect('/students.html') #删除后刷新跳转到学生信息页面
def edit_students(request): #学生信息修改
if request.method == "GET": #判断提交方式是否为GET
nid = request.GET.get('nid') #获取编辑列的id
obj = models.Students.objects.filter(id=nid).first() #获取编辑列的值
cs_list = models.Classes.objects.values('id','titile') #获取班级列表id和名称,用于修改学生班级下拉菜单
return render(request,'edit_students.html',{'obj':obj,'cs_list':cs_list}) #返回编辑页面,并附加要修改的值
elif request.method == "POST": #判断提交方式是否为POST
nid = request.POST.get("nid") #获取编辑列的id
u = request.POST.get("username") #获取编辑列的姓名
a = request.POST.get("age") #获取编辑列的年龄
g = request.POST.get("gender") #获取编辑列的性别
class_id = request.POST.get("cs_list") #获取编辑列的班级
models.Students.objects.filter(id=nid).update(username=u,age=a,gender=g,cs_id=class_id) #更新数据
return redirect('/students.html') #返回班级页面
teachers.py
# -*- coding:utf8 -*-
from django.shortcuts import render,redirect
from APP import models
def get_teachers(request): # 老师信息展示
tea_list = models.Teachers.objects.all() # 获取所有老师列表
return render(request, 'get_teachers.html', {'tea_list': tea_list}) # 返回老师页面,附加所有老师列表参数
def add_teachers(request): # 老师信息添加
if request.method == 'GET': # 判断提交方式
return render(request, 'add_teachers.html') # 返回添加老师页面
elif request.method == 'POST': # 判断提交方式
u = request.POST.get('name') # 获取填写姓名
a = request.POST.get('age') # 获取填写年龄
g = request.POST.get('gender') # 获取选择性别
# 获取的字段内容添加到数据库
models.Teachers.objects.create(
name=u,
age=a,
gender=g,
)
return redirect('/teachers.html') # 跳转到老师信息页面
def del_teachers(request): # 老师信息删除
nid = request.GET.get('nid') # 获取要删除的老师id
models.Teachers.objects.filter(id=nid).delete() # 删除选中老师
return redirect('/teachers.html') # 删除后刷新跳转到老师信息页面
def edit_teachers(request): # 老师信息修改
if request.method == "GET": #判断提交方式是否为GET
nid = request.GET.get('nid') #获取编辑列的id
obj = models.Teachers.objects.filter(id=nid).first() #获取编辑列的值
cs_list = models.Classes.objects.values('id','titile') #获取班级列表id和名称,用于修改学生班级下拉菜单
return render(request,'edit_teachers.html',{'obj':obj,'cs_list':cs_list}) #返回编辑页面,并附加要修改的值
elif request.method == "POST": #判断提交方式是否为POST
nid = request.POST.get("nid") #获取编辑列的id
u = request.POST.get("name") #获取编辑列的姓名
a = request.POST.get("age") #获取编辑列的年龄
g = request.POST.get("gender") #获取编辑列的性别
models.Teachers.objects.filter(id=nid).update(name=u,age=a,gender=g) #更新数据
return redirect('/teachers.html') #返回班级页面
admin.py
系统默认未变动
apps.py
from django.apps import AppConfig
class AppConfig(AppConfig):
name = 'APP'
models.py
# -*- coding:utf8 -*-
from django.db import models
class Classes(models.Model):
"""
班级表
"""
titile = models.CharField(max_length=32) #班级名称
m = models.ManyToManyField("Teachers") #班级和老师【多对多关系表】
class Teachers(models.Model):
"""
教师表
"""
name = models.CharField(max_length=32) #姓名
age = models.IntegerField() #年龄
gender = models.BooleanField() #性别
class Students(models.Model):
"""
学生表
"""
username = models.CharField(max_length=32) #姓名
age = models.IntegerField() #年龄
gender = models.BooleanField() #性别
cs = models.ForeignKey("Classes",on_delete=models.CASCADE,) #学生和班级【一对多关系表】
Mydjango
settings.py
INSTALLED_APPS
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'APP',
]
TEMPLATES
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'APP/templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
DATABASES
实验环境使用sqlite3数据库,可根据自身需求变更为其它数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
LANGUAGE_CODE
LANGUAGE_CODE = 'zh-hans'
STATIC_URL
STATIC_URL = '/static/'
STATICFILES_DIRS
STATICFILES_DIRS=(
os.path.join(BASE_DIR,"APP/static"),
)
urls.py
# -*- coding:utf8 -*-
from django.contrib import admin
from django.urls import path,re_path
from APP.views import index,classes,students,teachers
urlpatterns = [
path('admin/', admin.site.urls), # admin管理后台
re_path('^$',index.portal), # 首页
re_path('^classes.html$', classes.get_classes), # 班级页面
re_path('^add_classes.html$', classes.add_classes), # 添加班级
re_path('^del_classes.html$', classes.del_classes), # 删除班级
re_path('^edit_classes.html$', classes.edit_classes), # 编辑班级
re_path('^set_teacher.html$', classes.set_teacher), # 分配老师
re_path('^students.html$', students.get_students), # 学生页面
re_path('^add_students.html$', students.add_students), # 添加学生
re_path('^del_students.html$', students.del_students), # 删除学生
re_path('^edit_students.html$', students.edit_students),# 编辑学生
re_path('^teachers.html$', teachers.get_teachers), # 老师页面
re_path('^add_teachers.html$', teachers.add_teachers), # 添加老师
re_path('^del_teachers.html$', teachers.del_teachers), # 删除老师
re_path('^edit_teachers.html$', teachers.edit_teachers),# 编辑老师
]
测试
生成数据表
python manage.py makemigrations APP
python manage.py migrate
运行服务访问测试
python manage.py runserver