当前位置:网站首页>Django实现对数据库数据增删改查(一)

Django实现对数据库数据增删改查(一)

2022-08-09 09:11:00 止语---


结合前面接收的 web请求原理,这里继续介绍Django部分,本文主要是对于自己在学习Django过程中做一些笔记记录,方便日后回顾学习。

1.创建工程

因为本地安装的pycharm是社区版本,因此使用命令行的形式,创建一个学生管理系统

django-admin.py startproject studentManagementSys

创建好之后这里会做一下设置如下:

  1. 新增如下目录
    在这里插入图片描述
    对于app01和staitc 以及template的作用在使用的时候进行介绍

  2. 设置studentmanagementSys下的settings.py文件
    在这里插入图片描述

  3. 创建本地mysql数据库,并且安装pymsql,创建studentmanagesystem数据库和class表,如下所示
    **注:**对于本地安装mysql数据库和安装pymysql,比较简单,可以搜索网上自己安装
    在这里插入图片描述
    这里手动插入外键分别为1和2,对应的是Django-*数据

2.数据显示

需求1:将数据库中的班级信息展示出来,就和平时访问网站一样,请求服务端的信息(数据从数据库获取的),将其展示在web浏览器上给客户查阅

2.1数据模板

UI设计稿如下所示:
在这里插入图片描述

访问/classes/的时候展示班级信息,因此在template文件夹新增一个classes.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <h1>班级列表</h1>
    <table>
        <thead>
        <tr>
            <th>ID</th>
            <th>班级名称</th>
        </tr>
        </thead>
        <tbody>
            <tr>
                <td>1</td>
                <td>Django-1班</td>
            </tr>
        </tbody>
    </table>
</body>
</html>

注意:

  • 表头使用thead-tr-tr标签
  • 表中使用thead-tr-td
  • 标位设置使用tfoot -tr-td
    但是标中的数据比较多,希望是将所有数据都展示在前段,而且数据也是动态变化的,因此这样手动填写肯定不行,希望使用在数据库查询将得到的结果展示在客户端上,因此对上述的classes.html修改如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <h1>班级列表</h1>
    <table>
        <thead>
        <tr>
            <th>ID</th>
            <th>班级名称</th>
        </tr>
        </thead>
        <tbody>
        {% for row in class_list %}
            <tr>
                <td>{
   { row.id }}</td>
                <td>{
   { row.title }}</td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
</body>
</html>

注意:关于循环和取值使用jinjia2的相关语法。因此现在需要做的就是将数据库查询的结果放入class_list中。

2.2逻辑处理

那既然先显示数据,涉及到数据查询等相关逻辑处理,我们就把其放在app01下并建立一个view.py文件。处理逻辑有:

  • 查询数据库
  • 数据展示

路径如下所示
在这里插入图片描述

from django.shortcuts import render, redirect,HttpResponse
import pymysql


def classes(request):
    # pass
    # 访问classes的时候展示班级

    # 创建连接
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
                           db='studentmanagement',charset='utf8')
    # 创建游标
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 执行SQL,并返回收影响行数
    effect_row = cursor.execute("select id,title from class")
    class_list =cursor.fetchall()
    print(class_list)

    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()
    # 将查询得到的数据放在class_list列表中
    return render(request,'classes.html',{
    'class_list':class_list})

因为每一次逻辑处理都需要获取前段请求的信息,因此这里加入request参数,简单的理解为就是逻辑处理的前提是要知道客户请求什么内容,这一点非常重要,Django几乎每一次处理都是这样的格式func(request).

2.3路由分发

建立好了模板和视图函数之后,现在需要将url和上述功能进行关联起来,就是如何访问刚才的这个地址
在这里插入图片描述
在项目url路由分发中加入如上所示,这样整个访问逻辑如下:

  • 访问1270.0.1:8080/classes/的时候,先到url中找到url路由信息
  • 该路由对应的是views.classes视图函数
  • 进入该视图函数,首先查询数据库,获取数据信息,接着使用render调用模板classes.html进行渲染,因为浏览器“认识”html这个字符串,因此浏览器上进行展示
  • 运行命令行python manage.py runsever 127.0.0.1:8080
    展示如下所示:
    在这里插入图片描述

上述的数据展示就是日常完成的一个数据查询功能

3.数据添加

需求2:希望在前段可以进行数据添加,比如在添加班级名称输入框,添加之后点击提交成功,如下所示
在这里插入图片描述
因此首先要在classes.html界面展示一个添加按钮,修改classes.html如下:

在这里插入图片描述

可定义文档中的分区或节(division/section)。
标签可以把文档分割为独立的、不同的部分。它可以用作严格的组织工具,并且不使用任何格式与其关联。如果用 id 或 class 来标记
,那么该标签的作用会变得更加有效,因为要点击添加并跳转到添加的界面,这里自然使用 +href跳转至对应的连接请求

3.1添加新增模板

新增一个add_class.html模板,展示如需求中的界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>添加班级</h1>
    <form method="POST" action="/add_class/">
        <p>班级名称:<input type="text" name="title"/></p>
        <input type="submit" value="提交" />
    </form>
</body>
</html>

这样点击classes.html中的添加就会跳转到如上的界面中。那因为是添加数据到数据库中,因此这里提交数据的时候指定方法为POST,action为添加的请求界面

3.2添加视图函数

结合上面的Method=POST,这里点击跳转的时候使用的是GET方法,但是最终提交的时候用的是POST提交数据,关于form中使用Method和action可以参考html中的语法,因此这里说明访问这个“添加班级”首先使用GET查阅了界面,接着使用POST方法提交数据。这也是在上面为什么指定了method=POST的原因

在这里插入图片描述
这里同一个html里面会有两个方法,首先是界面展示的GET,其次是数据提交的POST方法。在app01.view.py新增

def add_class(request):
    if request.method == 'GET':
        return render(request,'add_class.html')
    else:
        # 获取add_class.html中的输入值
        v= request.POST.get('title')
        # 创建连接
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
                               db='studentmanagement', charset='utf8')
        # 创建游标
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

        # 执行SQL
        #cursor.execute("insert into class(title) values(%s)", [v,])
        cursor.execute("insert into class(title) values(%s)",v)
        conn.commit()

        # 关闭游标
        conn.close()
        # 关闭连接
        cursor.close()

        # 重新定向到url_patterns总
        return redirect('/classes')

添加成功之后,可以看到添加的结果,此时重定向到classes界面中,在该界面会进行数据的查询功能

3.3路由分发

在访问/add_class/,首先会去url_patterns下进行匹配,因此这里添加如下路由信息

url(r'^add_class/',views.add_class),

在这里插入图片描述
总结归纳:

  1. 点击添加根据href中指定的路径进行跳转到add_class界面,/add_class/查找路由分发器url_patterns找到views.add_class函数
  2. 界面防范使用GET访问add_class界面,展示输入框
  3. 输入数据后,点击提交(表单数据将通过 method 属性附加到 URL 上)
  4. 提交数据库后,重定向到classes路径,此时url_patterns找到views.classes函数,再次去查询,并展示在界面
    这样就完成了数据添加的功能

4.数据删除

需求3:界面展示一个删除按钮,点击删除后将数据库中的数据进行删除,并返回结果
在这里插入图片描述
这个删除功能其实就是,点击删除之后根据当前的id(key值)去主机中查询并删除数据库记录,删除之后再次查询并展示界面上,因此有:

  1. 获取待删除记录的id并送到视图函数进行逻辑处理(删除数据库记录),这里删除定义为del_class
  2. 再次查询数据库,重定向到/classes/

4.1模板

在这里插入图片描述

因为删除也是一个请求过程,且在template.classes.html每一行的id在展示的时候通过row.id可以获取到,因此在上述分析中,获取id就直接传入nid就可以获取待删除的记录的id信息了,这里的+href前文已经说过用法,这里不再赘述。

4.2删除视图函数

接着再app01.view.py中定义del_class(request)函数

def del_class(request):
    nid = request.GET.get('nid')
    # 创建连接
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
                           db='studentmanagement',charset='utf8')
    # 创建游标
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 执行SQL,并返回收影响行数
    cursor.execute("delete from class where id=%s",[nid,])
    conn.commit()

    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()
    return redirect('/classes/')

4.3路由分发

在4.1中的模板函数中

<a href="/del_class/?nid={
     { row.id }}">删除</a>

点击删除后,会访问/del_class/,此时会去url_patterns查询路由,因此在ulls.py文件中增加一个del_class的路由
在这里插入图片描述
查到到该路由会去del_class函数中进行逻辑处理。这样整个删除功能就做完了。

5.编辑

上述已经实现了查询,删除,增加功能
需求4:对查询的结果页中的记录进行编辑,编辑之后提交并展示编辑后的结果
这个需求和删除类似

5.1编辑模板

将信息展示如下,在右侧加入编辑功能
在这里插入图片描述
思路就是获取需要修改记录的id(key),修改数据后提交,当然这里既然要修改,那应该是界面展示出来原来的数据(班级名称),修改后提交到数据库
将classes.html模板修改为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <h1>班级列表</h1>
    <div>
        <a href="/add_class">添加</a>
    </div>

    <table>
        <thead>
        <tr>
            <th>ID</th>
            <th>班级名称</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        {% for row in class_list %}
            <tr>
                <td>{
   { row.id }}</td>
                <td>{
   { row.title }}</td>
                <td>
                    <a href="/edit_class/?nid={
     { row.id }}">编辑</a>
                    |
                    <a href="/del_class/?nid={
     { row.id }}">删除</a>
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
</body>
</html>

当然这里对于编辑和删除按钮可以分别使用两个不同的标签。
在这里插入图片描述

新增edit_class.html模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>编辑班级</h1>
    <form method="POST" action="/edit_class/?nid={
     { result.id }}">
        <!--input style="display:none" name="id" value="{
    { result.id }}"/-->
        <p>班级名称:<input type="text" name="title" value="{
     { result.title }}"/></p>
        <input type="submit" value="提交" />
    </form>
</body>
</html>

5.2编辑视图函数

这里就和删除的逻辑类似,先获取id信息(使用GET),再编辑提交数据(使用POST)

def edit_class(request):
    if request.method =='GET':

        nid = request.GET.get('nid')
        print(nid)
        # 创建连接
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
                               db='studentmanagement',charset='utf8')
        # 创建游标
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

        # 执行SQL,并返回收影响行数
        cursor.execute("select id, title from class where id=%s",[nid,])
        result = cursor.fetchone()
        # 关闭游标
        cursor.close()
        # 关闭连接
        conn.close()

        print(result)
        return render(request,'edit_class.html',{
    "result":result})
    else:
        # nid = request.POST.get('id')
        # title = request.POST.get('title')

        # 方法二 url传递数据
        nid = request.GET.get('nid')
        title = request.POST.get('title')

        # 创建连接
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456',
                               db='studentmanagement',charset='utf8')
        # 创建游标
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

        # 执行SQL,并返回收影响行数
        cursor.execute("update class set title=%s where id=%s",[title,nid,])
        conn.commit()
        # 关闭游标
        cursor.close()
        # 关闭连接
        conn.close()

        return redirect('/classes/')

5.3路由分发

在urls.py中新增如下路由信息

urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^classes/',views.classes),
    url(r'^add_class/',views.add_class),
    url(r'^del_class/',views.del_class),
    url(r'^edit_class/',views.edit_class),

这样就实现了前段对接服务端,服务端对接数据库的一个简单逻辑,实现了增、删、改、查的基本功能
1.查询与添加
在这里插入图片描述
2.删除
在这里插入图片描述
3.编辑
在这里插入图片描述
总结对于上述的功能归纳如下:

  • 1.新增路由分发路由,在url_patterns中定义路径与视图函数对应关系
    2.实现视图函数,调用render/redirect/Httpresponse实现渲染
    3.定义html模板函数

注意事项:
对于使用了模板的情况需要在settings.py中设置模板路径

TEMPLATES = [
    {
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'template')],
        ...
原网站

版权声明
本文为[止语---]所创,转载请带上原文链接,感谢
https://blog.csdn.net/rhx_qiuzhi/article/details/111408265