1. 查看班级列表 && 添加班级

根据“高内聚低耦合”原则,我们把url对应的函数放到单独的模块中(app1\views.py)

那么在urls.py中的路由便这样实现:

1
2
3
4
5
6
7
8
9
10
11
# ... #
from app1 import views

urlpatterns = [
# path('admin/', admin.site.urls),
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
# views.py #
# ... #
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:
# 提交表单后变为POST请求
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
<!-- class.html -->
<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
<!-- add_class.html -->
<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/显示表格