当前位置:网站首页>Django实现对数据库数据增删改查(二)
Django实现对数据库数据增删改查(二)
2022-08-09 09:11:00 【止语---】
目录
接着对 Django实现对数据库数据增删改查(一)的继续深入,接着对学生管理系统继续补充。之前的文中展示了去数据库中“一对多”的关系,本文实现“多对多”的逻辑关系
1.基本框架
1.1.路由分发
在studentManagementSystem.urls中新增对于学生信息的路由
url(r'^students/', views.students),
1.2.视图函数-逻辑处理
在studentManagementSys/app01/views.py中新增
def students(request):
return render(request,'students.html')
1.3.模板
在template下新建一个students.html模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>学生列表</h1>
<div>
<a ">添加</a>
</div>
<table>
<thead>
<tr>
<th>ID</th>
<th>班级姓名</th>
<th>所属班级</th>
<th>操作</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</body>
</html>
视图展示如下:
现在有了以上的“骨架”之后,需要做的就是将对对应的数据进行填充,就是丰富其框架
2.查询功能
按照上面展示信息,需要展示学生的id,所属班级,那现在有个学生表和有个班级表
所以这里使用一个联合查询的功能
select student.id,student.name,class.title from student left JOIN class on student.class_id= class.id"
这样可以丰富view.py中的student函数了
2.1.视图函数
def students(request):
"""
学生列表
:param request:封装请求相关的所有信息
:return:
"""
# 创建连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
db='studentmanagement',charset='utf8')
# 创建游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行SQL,并返回收影响行数
cursor.execute("select student.id,student.name,class.title from student left JOIN class on student.class_id= class.id")
student_list =cursor.fetchall()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
return render(request,'students.html',{'student_list':student_list})
2.2.模板函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>学生列表</h1>
<div>
<a >添加</a>
</div>
<table>
<thead>
<tr>
<th>学生ID</th>
<th>学生姓名</th>
<th>所属班级</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for row in student_list %}
<tr>
<td>{
{ row.id }}</td>
<td>{
{ row.name }}</td>
<td>{
{ row.title }}</td>
<td>
<a >编辑</a>
|
<a>删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
输出界面展示如下:
3.添加功能
3.1.路由分发
在url中新增,add_student
url(r'^add_student/',views.add_student),
3.2视图函数
def add_student(request):
return render(request,"add_student.html)
3.3.模板
新增一个add_student.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>添加学生</h1>
</body>
</html>
这里关于学生的添加,需要添加哪些东西是需要考虑的:
- 学生姓名
- 学生所属班级
那这里就需要考虑,姓名可以输入,但是班级是固定的,此时就需要从已有的班级中进行选择,就像每年开学报名一样,班级都是固定的,每个班级学生可以不固定,所以对add_student.html文件进行优化如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>添加学生</h1>
<form method="POST" action="/add_student/">
<p>学生姓名<input type="text" name="name"/></p>
<p>所属班级
<select >
<option>Django1班</option>
</select>
</p>
<input type="submit" value="提交" />
</form>
</body>
</html>
展示如下所示:
那这个班级信息自然去数据库查询获得,这里这里的思路就是,在view.py中add_student中,先查询出来班级信息,然后在add_student.html中使用一个for循环展示出班级信息,这个在前面的已经反复使用了
所以这里输入姓名和选择后班级后,进行提交,这里提交会涉及到是包含班级信息提交什么东西到后台去,是id还是内容?因为提交的是学生信息,学生表中存在的是学生id,姓名和班级id信息,所以如果是提交班级内容,还需要到后台再次去查询班级信息获取id
修改add_student.html文件如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>添加学生</h1>
<form method="POST" action="/add_student/">
<p>学生姓名<input type="text" name="name"/></p>
<p>所属班级
<select name="class_id">
{% for row in class_list %}
<option value="{
{ row.id }}">{
{ row.title }}</option>
{% endfor %}
</select>
</p>
<input type="submit" value="提交" />
</form>
</body>
</html>
修改add_student函数中的逻辑
def add_student(request):
if request.method == 'GET':
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
db='studentmanagement',charset='utf8')
# 创建游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行SQL,并返回收影响行数
cursor.execute("select id,title from class")
class_list =cursor.fetchall()
print(class_list)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
return render(request,'add_student.html',{'class_list':class_list})
else:
name = request.POST.get('name')
class_id = request.POST.get('class_id')
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
db='studentmanagement',charset='utf8')
# 创建游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行SQL,并返回收影响行数
cursor.execute("insert into student(name,class_id) values(%s,%s)",[name,class_id,])
conn.commit()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
return redirect('/students/')
那学生删除和add类似,和第一篇文中的逻辑处理类似
4.编辑功能
4.1路由分发
url(r'^edit_student/',views.edit_student),
4.2.视图函数
同时在views.py文中新增edit_student处理逻辑
def add_student(request):
return render(request,"edit_student.html")
如果界面点击使用该逻辑处理之后,界面展示应该是和新增类似
界面上有学生姓名和所属班级信息,编辑之后可以提交,那要编辑班级信息,此时必然要在edit_student中查询班级信息并放置在下来列表中,供编辑选择。结合一和本文发现不断的时候那几个关于sql的功能,此时就要想到将该公共处理部分提取出来
4.3.公共函数
新增一个utils模块,如下所示
import pymysql
def get_list(sql,args):
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
db='studentmanagement', charset='utf8')
# 创建游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行SQL,并返回收影响行数
cursor.execute(sql,args)
result = cursor.fetchall()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
return result
def get_one(sql,args):
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
db='studentmanagement', charset='utf8')
# 创建游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行SQL,并返回收影响行数
cursor.execute(sql,args)
result = cursor.fetchone()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
return result
def modify(sql,args):
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
db='studentmanagement', charset='utf8')
# 创建游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行SQL,并返回收影响行数
cursor.execute(sql,args)
conn.commit()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
4.4.模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>编辑学生</h1>
<form>
<p>学生姓名<input type="text" name="name"/></p>
<p>所属班级
<select name="class_id">
{% for row in class_list %}
<option value="{
{ row.id }}">{
{ row.title }}</option>
{% endfor %}
</select>
</p>
<input type="submit" value="提交" />
</form>
</body>
</html>
4.5.视图函数优化1
刚才只是写了视图函数,并没有实现具体的逻辑功能
def edit_student(request):
nid = request.GET.get('nid')
print(nid)
class_list = sqlhelper.get_list('select id,title from class',[])
curent_student_info = sqlhelper.get_one('select id,name,class_id from student where id=%s',nid)
return render(request,'edit_student.html',
{'class_list':class_list,"curent_student_info":curent_student_info})
但是这里编辑的时候返现,所欲班级的地方展示并不是默认班级信息。所以这类需要查询到每个学生默认的班级,这里会使用到html-option-selected属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>编辑学生</h1>
<form>
<p>学生姓名<input type="text" name="name" value="{
{ curent_student_info.name }}"/></p>
<p>所属班级
<select name="class_id">
{% for row in class_list %}
{% if row.id == curent_student_info.class_id %}
<option selected value="{
{ row.id }}">{
{ row.title }}</option>
{% else %}
<option value="{
{ row.id }}">{
{ row.title }}</option>
{% endif %}
{% endfor %}
</select>
</p>
<input type="submit" value="提交" />
</form>
</body>
</html>
4.6.视图函数优化2
有了上面的展示默认选择,现在需要实现的是提交功能
<h1>编辑学生</h1>
<form method="=POST" action="/edit_student/?nid={
{ curent_student_info.id }} ">
所以这里的姓名和班级信息是在psot数据的body中,学生id是在url中的?后面的数据,所以归结如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>编辑学生</h1>
<form method="POST" action="/edit_student/?nid={
{ curent_student_info.id }}">
<p>学生姓名<input type="text" name="name" value="{
{ curent_student_info.name }}"/></p>
<p>所属班级
<select name="class_id">
{% for row in class_list %}
{% if row.id == curent_student_info.class_id %}
<option selected value="{
{ row.id }}">{
{ row.title }}</option>
{% else %}
<option value="{
{ row.id }}">{
{ row.title }}</option>
{% endif %}
{% endfor %}
</select>
</p>
<input type="submit" value="提交" />
</form>
</body>
</html>
from utils import sqlhelper
def edit_student(request):
if request.method == 'GET':
nid = request.GET.get('nid')
class_list = sqlhelper.get_list('select id,title from class',[])
curent_student_info = sqlhelper.get_one('select id,name,class_id from student where id=%s',[nid,])
return render(request,'edit_student.html',
{'class_list':class_list,"curent_student_info":curent_student_info})
else:
nid = request.GET.get('nid')
name = request.POST.get('name')
class_id = request.POST.get('class_id')
print(nid,name,class_id)
sqlhelper.modify('update student set name=%s,class_id=%s WHERE id=%s',[name,class_id,nid,])
return redirect('/students/')
边栏推荐
- 国产谷歌地球,地形分析秒杀同款地图软件
- Difference: char* and char[]
- MVCC多版本并发控制
- mysql优化——show processlist命令详解
- MySQL Leak Detection and Filling (3) Calculated Fields
- 这下你知道为什么程序员要和产品干架了吧?
- PoPW token distribution mechanism may ignite the next bull market
- The 5th Blue Cap Cup preliminary misc reappears after the game
- STM32 如何知道FLASH的使用情况
- gin中模型中增删改查+搜索分页
猜你喜欢
随机推荐
医院智能3D蓝牙导航导诊系统
全球19级谷歌卫星地图免费查看下载
on duplicate key update
VoLTE基础自学系列 | IMS的业务触发机制
js实现看板全屏功能
C语言单、双引号的区别
运行flutter项目时遇到的问题修改flutter为国内镜像
MySQL查漏补缺(二)排序检索、过滤数据、模糊查询、正则表达式
AES/ECB/PKCS5Padding加解密
中国打造国产“谷歌地球”清晰度吓人
【培训课程专用】CA/TA调用模型-代码导读
STM32 如何知道FLASH的使用情况
PoPW token distribution mechanism may ignite the next bull market
【场景化解决方案】ERP系统与钉钉实现数据互通
Max Flow P
营养与健康(HIT2021秋)
Getting started with ctfshow-web Part of the file upload part solution
小程序/app触底加载更多数据
没有对象的可以进来看看, 这里有对象介绍
缓存的使用姿势:缓存穿透了怎么办?