目标,可以通过页面,添加学生
分析:需要有一个链接
链接点击后,是一个表单出来
可以在表单中添加内从
可以提交表单
表单提交后数据插入到数据库中
希望看到最新的结果(页面跳转到学生列表页)
新页面的完整的几个需求url名称,已想好,就叫add_stu
模板页面,主要提供表单页面,可以提交
由路对应关系,让路径与视图函数对应起来
视图函数,add_stu 处理主要的业务
在学生列表页的顶部添加链接 路由对应关系 视图函数推导出视函图函数需要处理的事情,需要的一些数据
""" 添加学生的功能 """
# 根据下面的sql语句,我们发现,需要有name,需要有gender
# 因此,期望浏览器在请求的时候可以带给我们
# 最终,我是要写一个sql语句,来插入数据
# 如何写sql语句
sql = "insert into student(name, gender) values ({name}, {gender})"
sql.format(name="张三", gender="保密")
# sql = "insert into student(name, 字段1,字段2) values ('张三', 字段1值,字段2值)"
# 下一行的写法可能存在的问题,如果name是一个not null 的字段,但是我们插入数据时不传值,除非1,not null 的数据有在认值, 2 not null 的数据自增长
# sql = "insert into student(字段1,字段2) values (字段1值,字段2值)"
# sql = "insert into student values (0号字段值,1号字段值,最后一个字段值)"
前端页面的设计
主要为视图提供数据的传输
代码
<!DOCTYPE html>
<!--作者:pyhui-->
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>添加学生</title>
</head>
<body>
<!--目标,在请求服务器的时候,带参数过去,告诉服务器,name,gender-->
<form action="">
姓名: <input type="text" name="name" value=""> <br>
性别:
<select name="gender" id="">
<option value="男">男</option>
<option value="女">女</option>
<option value="中性">中性</option>
<option value="保密">保密</option>
</select>
<br>
<input type="submit" value="注册提交">
</form>
</body>
</html>
测试视图一,参数的获取
结果
当前的请求方式 GET
GET请求的参数 <QueryDict: {‘name’: [‘666’], ‘gender’: [‘保密’]}>
POST请求的参数 <QueryDict: {}>
当前的视图函数接收参数的情况描述
情况一
当从学生列表页,点击链接进入添加学生页时
发起的是一个get请求
但是
不带参数
情况二
当从添加学生页的表单中,提交表单
发起的也是一个get请求
但是,get请求会带上参数
请求是get,提交表单也是get,渲染与跳转的区分代码
def add_stu(request):
""" 添加学生的功能 """
# 获取GET方式的参数:
# 从列表页进入到添加学生页,一定是一个GET请求
print("当前的请求方式", request.method)
print('GET请求的参数', request.GET)
print('POST请求的参数', request.POST)
print('get数据的长度', len(request.GET))
print("数据的存储,下一步,要跳转页面了")
if len(request.GET):
return redirect("/stu_list/")
else:
return render(request, "add_stu.html")
主要根据get参数的长度来判定
数据库的操作封装为模块""" 数据库模块 """
import pymysql
class DbSchool:
def __init__(self):
self.conn = self.get_conn() # 连接对象
self.cursor = self.get_cursor() # 游标对象
def get_conn(self):
""" 获取连接对象 """
conn = pymysql.connect(
host="127.0.0.1",
port=3306,
user="root",
passwd="root",
db="python2019",
charset="utf8"
)
return conn
def get_cursor(self):
"""获取游标对象"""
# cursor = None
cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)
return cursor
def select_all(self, sql):
"""
查询全部
:param sql: 查询语句
:return: [{},{}]
"""
self.cursor.execute(sql)
return self.cursor.fetchall()
def select_one(self, sql):
"""
查询一个
:param sql: 查询语句
:return: {}
"""
self.cursor.execute(sql)
return self.cursor.fetchone()
def commit_data(self, sql):
"""
提交数据
:param sql:
:return:
"""
self.cursor.execute(sql)
self.conn.commit()
def __del__(self):
self.cursor.close()
self.conn.close()
db = DbSchool()
继续视图的逻辑,插入数据
def add_stu(request):
""" 添加学生的功能 """
if len(request.GET):
# 获取name参数值
name = request.GET.get("name")
gender = request.GET.get("gender")
# 当表单提交数据时
sql = "insert into student(name,gender) values('{}','{}')".format(name, gender)
print('当前执行的sql语句是\n',sql)
db.commit_data(sql)
print('恭喜,插入数据成功')
return redirect("/stu_list/")
else:
# 当进入添加学生页面时
return render(request, "add_stu.html")