django-数据的插入-利用pymysql

柔情痞子 提交于 2019-11-26 07:39:20

目标:

用户可以通过网页,向数据库中插入数据

同时,插入后可以跳转到列表页 /students,可以看到最新的结果

完成添加学生功能的基本准备

主要目标,弄一个add_student的页面

  • 在学生列表页,添加一个链接。用于点击后可以跳转到新的url
    在这里插入图片描述

  • 弄一个路由对应关系

在这里插入图片描述

  • 编写视图函数,目前只要让页面可以通就好

在这里插入图片描述

  • 访问页面,测试是否已经调通

在这里插入图片描述

  • 弄一个添加学生的表单

表单的设计需要参看一下数据表

mysql> desc student;
+------------+-------------------------------+------+-----+---------+----------------+
| Field      | Type                          | Null | Key | Default | Extra          |
+------------+-------------------------------+------+-----+---------+----------------+
| id         | int(10) unsigned              | NO   | PRI | NULL    | auto_increment |
| name       | varchar(20)                   | NO   |     | NULL    |                |
| gender     | enum('男','女','中性','保密') | YES  |     | 保密    |                |
| teacher_id | int(11)                       | YES  |     | NULL    |                |
+------------+-------------------------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

由此可见,表单中必有的数值要有 name

id由于自增长,不给他也可以的

在这里插入图片描述

模板页的代码如下:

<!DOCTYPE html>
<!--作者:pyhui-->
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>添加学生</title>
</head>
<body>
<h1>添加学生</h1>
<form action="" method="post">
    <label for="">学生姓名:</label><input type="text"> <br>

    <label for="">性别:</label>
    <select name="gender" id="">
        <option value="男">男</option>
        <option value="女">女</option>
        <option value="中性">中性</option>
        <option selected value="保密">保密</option>
    </select>
    <br>
    <input type="submit">
    
</form>

</body>
</html>

这里有个小问题。。。

视图函数小做修改

def add_student(request):
    method = request.method
    print('请求方式', method)
    return render(request, "add_student.html")

访问网址时

在这里插入图片描述

后端的输出
在这里插入图片描述

浏览器发数据给后端

在这里插入图片描述

接收不到学生姓名的数据

当提交表单后,后端输出的结果为:

请求方式 POST
<QueryDict: {‘gender’: [‘保密’]}>

寻找原因。类型为text的input框,没有加name属性

在这里插入图片描述
注,如果进行表单的提交,相关的表单控件(表单控件指的就是input标签) 如果需要把数据传到服务端,控件的标签应该要有name属性

补上,再传递参数试一试

效果比对

在这里插入图片描述

获取POST参数,保存到数据库中

在这里插入图片描述

接下来,要把数据保存到mysql中

由于数据库的连接,游标对象的定义等操作代码多且使用频繁

可以考虑把他们封装为一个模块中。需要的时候直接导入。

因此,代码写到这里,先暂停一阵。

完成pymysql的封装再继续。

封装pymysql常用方法

新建一个模块,处理pymysql的操作, 例如: sql_handle.py

代码如下:

# 作者:pyhui
"""数据库功能封装"""
import pymysql

class SqlDb:
    def __init__(self):
        # 数据库连接对象创建
        self.conn = pymysql.connect(
            host="127.0.0.1",
            port=3306,
            user="root",
            passwd="root",
            db="python2019",
            charset="utf8"
        )

        # 游标对象的创建
        self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)

    def select_from_table(self, sql, args):
        """
        从表中查询所有的数据
        :param table_name: 表名称
        :return: 全部数据,列表包字典
        """
        send_sql = sql.format(*args)
        print(send_sql)
        self.cursor.execute(send_sql)
        return self.cursor.fetchall()

    def act_table(self, sql, args):
        send_sql = sql.format(*args)
        print(send_sql)
        self.cursor.execute(send_sql)
        self.conn.commit()
        print('提交成功')

db = SqlDb

if __name__ == '__main__':

    db = SqlDb()
    sql = "insert into {} values {}"
    args = ("student", (0,"布尔玛","女",2))
    db.act_table(sql, args)

继续后端POST参数的写入

临时停个笔,去看哪扎传奇。回来了再写

模块有问题需要改

更新后的后端代码要加入

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!