GET请求传参数的方式: /xxx/?k1=v1&k2=v2 ? 前面的是URL ?后面的是请求的参数 多个参数之间用&分隔 POST请求传数据: 是放在请求体里面的
表结构设计.
-- 创建班级表 CREATE TABLE class( id int auto_increment PRIMARY KEY, name CHAR(10) not null )engine=innodb DEFAULT charset=utf8; -- 创建学生表 CREATE TABLE student( id int auto_increment PRIMARY KEY, name CHAR(10) not null, class_id INT, FOREIGN KEY (class_id) REFERENCES class(id) ON DELETE CASCADE ON UPDATE CASCADE )engine=innodb DEFAULT charset=utf8; -- 创建老师表 CREATE TABLE teacher( id int auto_increment PRIMARY KEY, name CHAR(10) not null )engine=innodb DEFAULT charset=utf8; -- 创建老师和班级关系表 CREATE TABLE teacher2class( id INT AUTO_INCREMENT PRIMARY KEY, teacher_id INT,FOREIGN KEY (teacher_id) REFERENCES teacher(id) ON DELETE CASCADE ON UPDATE CASCADE , class_id INT,FOREIGN KEY (class_id) REFERENCES class(id) ON DELETE CASCADE ON UPDATE CASCADE )engine=innodb DEFAULT charset=utf8; 表结构设计
视图函数+模板语言+pymysql
视图函数:
我们把所有的处理请求相关的函数从 urls.py中拿出来,统一放在一个叫views.py的文件中,这样就把代码模块化,实现不同功能的代码放在不同的模块。
urls.py文件中只放置 URL和函数的对应关系
views.py 文件中只放置那些针对不同URL执行的函数
注意:
这个时候就需要在urls.py中导入views.py文件(views前面加.表明从当前目录下导入)
from .views import index, login, class_list, delete_class, add_class, edit_class
展示所有的班级列表
# 展示所有的班级列表 def class_list(request): # 这个函数是展示所有的班级列表 # 1. 去数据库里取数据 # 连接数据库 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 指定pymysql查询出的每条数据的类型是字典类型({"字段名": "值"}) ***** cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 写好查询的SQL语句 sql = "select id, cname from class order by id;" # 执行上面定义好的SQL语句 cursor.execute(sql) # 拿到所有查询到的结果 # 此处查询结果是一个大列表,里面是一个一个字典 ret = cursor.fetchall() # 关闭连接 cursor.close() conn.close() # 2. 用数据去替换html页面中的特殊符号,特殊符号是按照Django模板语言的语法写好的 # render()的第三个参数是一个字典,字典的key是什么,HTML文件中的变量名就写什么 return render(request, "class_list.html", {"class_list": ret})
页面部分:
这里用到了Django模板语言的for循环
<!-- Table --> <div class="my-table-wrapper"> <table class="table table-bordered table-striped"> <thead> <tr> <th>#</th> <th>班级ID</th> <th>班级名称</th> <th>操作</th> </tr> </thead> <tbody> {% for class in class_list %} <tr> <td>{{ forloop.counter }}</td> <td scope="row">{{ class.id }}</td> <td>{{ class.cname }}</td> <td class="text-center"> <a href="/edit_class/?class_id={{ class.id }}" type="button" class="btn btn-sm btn-info" aria-label="Left Align"> <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>新页面编辑 </a> <a type="button" class="btn btn-sm btn-success" aria-label="Left Align"> <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>编辑 </a> <a href="/delete_class/?class_id={{ class.id }}" type="button" class="btn btn-sm btn-danger" aria-label="Left Align"> <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>删除 </a> </td> </tr> {% endfor %} </tbody> </table>
删除班级
# 删除班级 def delete_class(request): # 根据班级的ID删除 # 班级ID从哪儿来? --> 需要页面发起请求的时候携带 # 页面如何携带要删除的班级的ID? --> 通过给a标签设置href属性时拼接 # 后端拿到要删除的班级的ID class_id = request.GET.get("class_id") # 去数据库里删除 # 连接数据库 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 指定输出的每条数据的类型是字典 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 删除操作的SQL语句 sql = "delete from class where id=%s;" # 执行删除语句 cursor.execute(sql, class_id) # 向数据库提交操作 conn.commit() cursor.close() conn.close() # 执行完删除操作后跳转回班级列表页面 return redirect("/class_list/")
页面部分:
浏览器发起的GET请求通过在URL后面添加/url/?k1=v1&k2=v2的方式添加参数。
使用Django模板语言的语法将{{ class.id }}拼接到了a标签的href属性中。
这样页面点击这个a标签就能把要删除的班级ID值传递给后端了。
<a href="/delete_class/?class_id={{ class.id }}" type="button" class="btn btn-sm btn-danger" aria-label="Left Align"> <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>删除 </a>
添加班级
# 添加班级 def add_class(request): # 如果是POST请求,就表明是页面要提交数据 if request.method == "POST": # 页面使用POST方法提交添加班级的数据 # 后端取到新班级的名称信息 class_name = request.POST.get("cname") conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 指定输出的结果类型是字典 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 新增班级的SQL语句 sql = "insert into class (cname) VALUE (%s);" # 执行SQL语句,在数据库中创建一条新的班级记录 cursor.execute(sql, class_name) # 向数据库提交 conn.commit() # 关闭连接 cursor.close() conn.close() # 新添加一个班级之后跳转到班级列表页面 return redirect("/class_list/") # 如果不是POST请求就返回添加班级页面 return render(request, "add_class.html")
页面部分:
利用form表单向后端提交新班级的数据,所以add_class.html页面中form表单要填写上action="/add_class/” 和 method=“post”
<form action="/add_class/" method="post"> <input type="text" name="cname"> <input type="submit" value="提交"> </form>
编辑班级信息
# 新页面编辑班级信息 def edit_class(request): # 如果是POST请求 if request.method == "POST": # 从页面POST过来的数据中取到编辑的班级ID class_id = request.POST.get("id") # 从页面POST过来的数据中取到班级名称 class_cname = request.POST.get("cname") # 去数据库里面更新班级名称 # 连接数据库 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 获取光标 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 更新班级信息的SQL语句 sql = "update class set cname=%s where id=%s;" # 执行SQL语句 cursor.execute(sql,(class_cname, class_id)) # 向数据库提交修改 conn.commit() # 关闭连接 cursor.close() conn.close() # 更新完班级信息之后跳转回班级列表页面 return redirect("/class_list/") # 如果不是POST请求,就表明是点击了新页面编辑班级信息的按钮 # 取到被编辑的班级的ID class_id = request.GET.get("class_id") # 去数据库里查询当前班级的信息 conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 指定输出的单条数据的类型是字典 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 查询的SQL语句 sql = "select id, cname from class WHERE id=%s;" # 执行查询操作 cursor.execute(sql, class_id) # 取单条数据 ret = cursor.fetchone() # 关闭连接 cursor.close() conn.close() # 把要编辑的班级的信息 替换 edit_class.html 页面中的特殊符号,最后把页面返回给浏览器 return render(request, "edit_class.html", {"class_info": ret})
页面部分:
编辑班级信息在页面上展示的就是一个form表单,用户更新完班级信息之后要提交,就需要向后端提交表单数据。
这个时候form表单就需要配置好 action="/edit_class/" 和 method="post"。
但是提交的数据里需要告知后端,我更改的是数据库中的哪一条班级信息,所以这里要把班级ID也放到form表单中。
班级ID不应该让用户修改,所以就把班级ID的input框给隐藏掉。
<form action="/edit_class/" method="post"> <input type="text" name="id" value="{{ class_info.id }}" style="display: none"> <input type="text" name="cname" value="{{ class_info.cname }}"> <input type="submit" value="提交"> </form>