注:该系统搭建采用Django框架,MySQL数据库以及HTML+CSS
前期准备:搭建好Django框架,以及数据表
参考视频:Python全栈(老男孩4期)Django框架入门到应用
温馨提示:
-
该系统搭建需使用pymysql,通过命令行(pip install pymysql)安装,并import到views.py中
-
本博客不提供完全代码,如何实现及美化需读者阅读博客后自行完成
-
若本博客中的部分代码未定义但使用,请读者查看上述参考视频,或凭借自己能力解决
-
由于时间匆忙,相关知识了解不够,若在表述上出现根本性错误,请谅解
目录
- 1 总体介绍
- 2 班级
- 3 学生信息
- 4 学生成绩
- 5 总结
1 总体介绍
- 班级管理:增删改功能
- 学生信息管理:增删改查功能
- 学生成绩管理:改查功能
- 数据表:班级(class)、学生(student)、学院(college)、性别(sex)
2 班级
2.1 url配置
- url(r'^classes/', views.classes) — 班级查看主页面
- url(r'^add_class/', views.add_class) — 添加班级页面
- url(r'^del_class/', views.del_class) — 删除班级(无单独页面)
- url(r'^edit_class/', views.edit_class) — 编辑班级页面
2.2 views.py函数设计
2.2.1 classes
2.2.1.1 设计思路
以表格的形式显示所有的班级,我们需要获取数据表中所有班级的数据,并且逐条显示再网页上
2.2.1.2 完整代码
def classes(request):
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("select id, title from class") #从名为class的数据表中获取Name为id和title的域
class_list = cursor.fetchall() #通过fetchall()函数将获取的所有数据保存在class_list列表中
cursor.close()
conn.close()
return render(request, 'classes.html', {'class_list': class_list}) #返回到/classes.html中,并且令html中class_list赋值为刚刚赋值好的class_list (注:render需引入)
2.2.2 add_class
2.2.2.1 设计思路
在班级主界面设计一个添加班级的选项,点击后可跳转到添加班级的页面,在输入框中输入相应班级信息并提交后,后台可得到并插入到数据表中,前端可跳转到班级主界面并显示新增班级
2.2.2.2 部分代码
def add_class(request):
if request.method == "POST":
v = request.POST.get('title') #获得在对话框中输入的title值赋值给变量v
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute('insert into class(title) values(%s)', v) #将变量v的值插入到class数据表中的title域中
conn.commit()
cursor.close()
conn.close()
return redirect('/classes/') #返回到/classes.html页面(注:redirect需引入)
2.2.3 edit_class
2.2.3.1 设计思路
在班级表格中每一行都设置一个编辑选项,点击编辑选项后可得到该行对应的id值,并通过id值在数据表中获取对应的其他信息,前端跳转到编辑界面;后台获取提交的修改完的班级信息,并在数据表对应的地方更新,并返回班级主界面
2.2.3.2 部分代码
def edit_class(request):
if request.method == "POST": #从编辑界面返回主界面时
nid = request.GET.get('nid')
title = request.POST.get('title')
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("update class set title=%s where id = %s", [title, nid, ]) #更新class数据表中对应id值的title值
conn.commit()
cursor.close()
conn.close()
return redirect('/classes/')
2.2.4 del_class
2.2.4.1 设计思路
在班级表格中每一行都设置一个删除选项,点击删除选项后可获得该行对应的id值,并通过id值在数据表中删除对应的所有信息
2.2.4.2 完整代码
def del_class(request):
nid = request.GET.get('nid')
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("delete from class where id=%s", [nid, ]) #删除class数据表中对应id值的所有信息
conn.commit()
cursor.close()
conn.close()
return redirect('/classes/')
2.3 HTML设计
2.3.1 班级信息主页面
2.3.1.1 设计思路
本页面显示班级的表格,表格信息包括班级的序号以及班级名称,表格操作包括编辑和删除,在该页面还独立设计一个添加班级选项和返回首页选项
2.3.1.2 表格代码
<table>
<thead>
<tr>
<th>序号</th>
<th>班级名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for row in class_list%} #由class函数中的render()函数里赋值的class_list,通过循环语句实现显示所有班级信息
<tr>
<td>{{ row.id }}</td>
<td>{{ row.title}}</td>
<td>
<a href="/edit_class/?nid={{ row.id }}">编辑</a>
|
<a href="/del_class/?nid={{ row.id }}">删除</a>
</td>
</tr>
{% endfor %} #结束循环的标志
</tbody>
</table>
2.3.1.3 页面展示(CSS美化后)
2.3.2 添加班级页面
2.3.2.1 设计思路
将输入的班级名称通过submit的方式给后台接收,并作用到该页面,还设计了一个独立的取消选项,点击后可返回到班级主页面
2.3.2.2 部分代码
<form method="POST" action="/add_class/">
<p>班级名称:<input type="text" name="title" />
<input type="submit" value="提交" />
</form>
2.3.2.3 页面展示
2.3.3 编辑班级页面
2.3.3.1 设计思路
在编辑页面可以先显示原班级名称,其余和2.3.2.1相同
2.3.3.2 部分代码
<form method="POSt" action="/edit_class/?nid={{ result.id }}">
<p>班级名称:<input type="text" name="title" value="{{ result.title }}"> #name="title"表示其值的名称为title,与edit_class对应
<input type="submit" value="提交" />
</form>
2.3.3.3 页面展示
2.4 小结
班级信息管理部分内容不多,只是涉及简单的增删改操作
只需要搞清楚POST和GET操作,再通过pymysql的三个操作(select,delete,update)及其特性即可实现函数功能
通过HTML中如何创建表格、<form>、<input>以及{% %}用法即可实现前端与后端相接
3 学生信息
3.1 url配置
- url(r'^student/', views.student) — 学生信息主页面
- url(r'^add_student/', views.add_student) — 添加学生信息页面
- url(r'^edit_student/', views.edit_student) — 编辑学生信息页面
- url(r'^del_student/', views.del_student) — 删除学生信息(无独立页面)
- url(r'^detail_student/', views.detail_student) — 学生信息详情页面
- url(r'^search/', views.search_student) — 查询学生信息页面
3.2 views.py函数设计
3.2.1 student
3.2.1.1 设计思路
点击“学生信息管理”选项后,获取所有student数据表中的信息,并将这些信息赋值给一个列表,再通过render()将这个列表中的数据传给前端,页面跳转到student.html,并显示所有学生信息
3.2.1.2 完整代码
def student(request):
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("select student.id, student.student_id, student.name, class.title from student left JOIN class on student.class_id = class.id") #由于要获取班级信息,所以要左联class数据表
student_list = cursor.fetchall()
cursor.close()
conn.close()
return render(request, 'student.html', {'student_list': student_list})
3.2.2 add_student
3.2.2.1 设计思路
点击“添加学生信息“后,获取所有班级信息,将所有信息保存在class_list列表里,传递给前端;在添加学生信息页面输入完学生所有信息以后,得到所有信息并插入到student数据表中
3.2.2.2 部分代码
def add_student(request):
if request.method == "GET":
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("select id,title from class")
class_list = cursor.fetchall()
cursor.close()
conn.close()
return render(request, 'add_student.html', {'class_list': class_list})
3.2.3 edit_student
3.2.3.1 设计思路
与edit_class相同。在表格每一行点击“编辑”选项时,得到对应的id值,并通过该id值在数据表里获取所有对应该id值的信息,并返还给前端;修改完信息之后,得到所有修改后的信息并在student数据表对应的id值处更新,并返回学生信息主页面
3.2.3.2 部分代码
def edit_student(request):
if request.method == "GET":
nid = request.GET.get('nid')
class_list = sqlhelper.get_list("select id,title from class", [])
current_student_info = sqlhelper.get_one(select sex, college, major, telenumber,id,name,class_id,student_id from student where id=%s", [nid, ]) #sqlhelper.py里保存了前后端的接口函数
college_list = sqlhelper.get_list("select * from college", []) #college数据表保存所有学院信息
sex_list = sqlhelper.get_list("select * from sex", []) #sex数据表中保存性别
return render(request, 'edit_student.html',
{'class_list': class_list, 'current_student_info': current_student_info, 'college_list': college_list, 'sex_list': sex_list})
3.2.4 del_student
3.2.4.1 设计思路
同del_class
3.2.4.2 完整代码
def del_student(request):
nid = request.GET.get('nid')
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='project1', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("delete from student where id=%s", [nid, ])
conn.commit()
cursor.close()
conn.close()
return redirect('/student/')
3.2.5 detail_student
3.2.5.1 设计思路
原理与student差不多,由于不存在增删改查的操作,故只需在点击“详情”时,获取需要的信息,再返回给前端显示
3.2.5.2 完整代码
def detail_student(request):
nid = request.GET.get('nid')
current_student_info = sqlhelper.get_one("select student.sex, student.college, student.major, "
"student.telenumber,student.id,student.name,student.student_id ,"
"class.title from student left JOIN class on student.class_id = class.id "
"where student.id = %s", [nid, ])
return render(request, 'detail_student.html',
{'current_student_info': current_student_info})
3.2.6 search_student
3.2.6.1 设计思路
在对话框里输入待查询的学号后,前端得到学号(studentID),再传递到后端获取对应其学号需要的信息
3.2.6.2 完整代码
def search_student(request):
if request.method == "POST":
studentID = request.POST.get('studentID')
search_student_info = sqlhelper.get_one("select student.sex, student.college, student.major, "
"student.telenumber,student.id,student.name,student.student_id ,"
"class.title from student left JOIN class on student.class_id = "
"class.id where student.student_id = %s", [studentID, ])
return render(request, 'search.html', {'search_student_info': search_student_info})
3.3 HTML设计
3.3.1 学生信息主页面
3.3.1.1 设计思路
与班级信息主页面类似,主要是对于查询功能的补充。而对于查询功能,其实现方法是利用POST操作submit学号完成的
3.3.1.2 部分代码
<div>
<a href="/add_student/">添加学生信息</a>
<a href="/head_page/">返回首页</a>
<form action="/search/" method="POST">
<p>查询学生信息:<input type="text" name="studentID" placeholder="学号..." /> #studentID与search_student()中的studentID对应
<input type="submit" value="查询">
</form>
</div>
3.3.1.3 页面展示
3.3.2 添加学生信息页面
3.3.2.1 设计思路
与添加班级页面差不多,不过此处学院、性别以及班级的确定是通过下拉选项框实现的,而不是自己输入
3.3.2.2 部分代码
<p>学号:<input type="text" name="student_id" /></p>
<p>姓名:<input type="text" name="name" /></p>
<p>
性别:
<select name="name">
<option value ="男">男</option>
<option value ="女">女</option>
</select>
</p>
3.3.2.3 页面展示
3.3.3 编辑学生信息页面
3.3.3.1 设计思路
此处设计比较麻烦。一是要实现在编辑学生时能够显示原信息,二是对于学院、性别以及班级仍是用下拉选项框的方式解决,但是需要先显示原信息
3.3.3.2 部分代码
<p>性别:
<select name="sex">
{% for row in sex_list %}
{% if row.sex == current_student_info.sex %}
<option selected value="{{ row.sex }}">{{ row.sex }}</option>
{% else %}
<option value="{{ row.sex }}">{{ row.sex }}</option>
{% endif %}
{% endfor %}
</select>
</p>
3.3.3.3 页面展示
3.3.4 学生信息详情页面
3.3.4.1 设计思路
与student以及classes处理方法类似,只不过是只显示一名学生的信息,而不是所有学生或班级
3.3.4.2 部分代码
<table border="1">
<thead>
<tr>
<th>姓名</th>
<th>学号</th>
<th>性别</th>
<th>班级</th>
<th>学院</th>
<th>专业</th>
<th>电话</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{current_student_info.name}}</td>
<td>{{current_student_info.student_id}}</td>
<td>{{current_student_info.sex}}</td>
<td>{{current_student_info.title}}</td>
<td>{{current_student_info.college}}</td>
<td>{{current_student_info.major}}</td>
<td>{{current_student_info.telenumber}}</td>
</tr>
</tbody>
</table>
3.3.4.3 页面展示
3.3.5 查询学生信息页面
3.3.5.1 设计思路
与3.3.4.1一致
3.3.5.2 部分代码
<table border="1">
<thead>
<tr>
<th>姓名</th>
<th>学号</th>
<th>性别</th>
<th>班级</th>
<th>学院</th>
<th>专业</th>
<th>电话</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{search_student_info.name}}</td>
<td>{{search_student_info.student_id}}</td>
<td>{{search_student_info.sex}}</td>
<td>{{search_student_info.title}}</td>
<td>{{search_student_info.college}}</td>
<td>{{search_student_info.major}}</td>
<td>{{search_student_info.telenumber}}</td>
</tr>
</tbody>
</table>
3.3.5.3 页面展示
3.4 小结
学生信息的编辑是本次系统搭建的重点,也是难点。
相比于班级信息管理,这里涉及到的操作更多,并且实现的功能更复杂,需要我们搞清楚class中的每一行代码,理解其含义,才能举一反三实现增删改查功能,以及更复杂的HTML+Django语句。
4 学生成绩
4.1 url配置
- url(r'^exam/', views.exam) —学生成绩主页面
- url(r'^edit_exam', views.edit_exam) —编辑学生成绩页面
- url(r'^search_exam', views.search_exam) —查询学生成绩页面
4.2 设计思路
将学生成绩的数据保存在student数据表里,只不过再获取或得到的时候选择科目而不是学院、性别、电话等无关信息。其余的与上述的并无差异,故不再赘述