1. 查看班级列表 && 添加班级
根据“高内聚低耦合”原则,我们把url对应的函数放到单独的模块中(app1\views.py
)
那么在urls.py
中的路由便这样实现:
1 2 3 4 5 6 7 8 9 10 11
| from app1 import views
urlpatterns = [ path('login/', views.login), path('index/', views.index), path('classes/', views.classes), path('add_class/', views.add_class), ]
|
我们先在mysql数据库”DjangoTestDB”中创建好班级对应数据表”classes”:
1 2 3 4
| mysql> create table classes( -> id int unsigned not null auto_increment primary key, -> name varchar(8) not null unique -> )character set = utf8;
|
目前的需求:在班级列表页classes/
点击添加按钮,跳转到添加班级页add_class/
,提交表单后重新跳转到班级列表页,并显示添加后的所有班级。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
import mysql def classes(request): conn = pymysql.connect("localhost","root","010616dhy","DjangoTestDB",charset="utf8") cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("select id, name from classes") class_list = cursor.fetchall() cursor.close() conn.close()
return render(request, "classes.html", {"class_list": class_list})
def add_class(request): if request.method == "GET": return render(request, "add_class.html") else: add_class = request.POST.get("class_name") conn = pymysql.connect("localhost","root","010616dhy","DjangoTestDB",charset="utf8") cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("insert into classes(name) value(%s);", [add_class, ]) conn.commit() cursor.close() conn.close() return redirect("/classes/")
|
对应的html部分内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <h1>班级列表</h1> <a href="\add_class\">添加</a> <table> <thead> <tr> <th>ID</th> <th>班级名</th> </tr> </thead> <tbody> {% for item in class_list %} <tr> <th>{{ item.id }}</th> <th>{{ item.name }}</th> </tr> {% endfor %} </tbody> </table>
|
1 2 3 4 5 6
| <h1>添加班级</h1> <form method="POST" action="\add_class\"> <input type="text" name="class_name"> <input type="submit" name="提交"> </form>
|
2. 删除班级
首先我们在表格中添加delete
选项:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <thead> <tr> <th>ID</th> <th>班级名</th> <th>操作</th> </tr> </thead> <tbody> {% for item in class_list %} <tr> <th>{{ item.id }}</th> <th>{{ item.name }}</th> <th><a href="\del\?nid={{ item.id }}">删除</a></th> ...
|
通过?nid={{ item.id }}
令get请求传参(要删除行对应的id),而后添加路由:
1
| path('del/', views.del_class),
|
views.py
的删除函数:
1 2 3 4 5 6 7 8 9
| def del_class(request): del_id = request.GET.get("nid") conn = pymysql.connect("localhost","root","010616dhy","DjangoTestDB",charset="utf8") cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("delete from classes where id=(%s);", [del_id, ]) conn.commit() cursor.close() conn.close() return redirect("/classes/")
|
每次删除操作实际上一共有2次http请求,一次get传参,一次重定向请求。
3. 编辑班级
class.html
内新增:
1 2 3 4 5
| <th> <a href="\edit\?nid={{ item.id }}">编辑</a> | <a href="\del\?nid={{ item.id }}">删除</a> </th>
|
点击编辑按钮,通过GET传递id,对应的路由:
1
| path('edit/', views.edit_class),
|
views.py
对应的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| def edit_class(request): if request.method == "GET": edit_id = request.GET.get("nid") conn = pymysql.connect("localhost","root","010616dhy","DjangoTestDB",charset="utf8") cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("select id,name from classes where id=%s", [edit_id, ]) result = cursor.fetchone() cursor.close() conn.close() return render(request, "edit_class.html", {'result':result})
else: edit_id = request.GET.get("nid") edit_name = request.POST.get("class_name") conn = pymysql.connect("localhost","root","010616dhy","DjangoTestDB",charset="utf8") cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("update classes set name=%s where id=%s", [edit_name, edit_id,]) conn.commit() cursor.close() conn.close() return redirect("/classes/")
|
初次点击编辑,通过GET方式发送请求,获得id取出数据库对应的name
传递到模板中,渲染出默认填充内容。
编辑完成后以POST方式发送请求到本页面,url内仍传递id参数,编辑id对应数据库内容后,重定向到/classes/
显示表格