django-添加学生的制作-模块的封装

目标,可以通过页面,添加学生

分析:

需要有一个链接

链接点击后,是一个表单出来

可以在表单中添加内从

可以提交表单

表单提交后数据插入到数据库中

希望看到最新的结果(页面跳转到学生列表页)

新页面的完整的几个需求

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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲸鱼编程pyhui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值