文章目录

  • 1.创建工程
  • 2.数据显示
    • 2.1数据模板
    • 2.2逻辑处理
    • 2.3路由分发
  • 3.数据添加
    • 3.1添加新增模板
    • 3.2添加视图函数
    • 3.3路由分发
  • 4.数据删除
    • 4.1模板
    • 4.2删除视图函数
    • 4.3路由分发
  • 5.编辑
    • 5.1编辑模板
    • 5.2编辑视图函数
    • 5.3路由分发

结合前面接收的 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 pymysqldef 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')],...

Django实现对数据库数据增删改查(一)相关推荐

  1. Django实现对数据库数据增删改查(二)

    目录 1.基本框架 1.1.路由分发 1.2.视图函数-逻辑处理 1.3.模板 2.查询功能 2.1.视图函数 2.2.模板函数 3.添加功能 3.1.路由分发 3.2视图函数 3.3.模板 4.编辑 ...

  2. 数据库数据增删改查练习题(1)——学生选课数据库

    数据库数据增删改查练习题(1)--学生选课数据库 基本数据表 S(SNO,SNAME,AGE,SEX)学生 C(CNO,CNAME,TEACHER)课程 SC(SNO,CNO,GRADE)选课 练习题 ...

  3. Django数据库数据增删改查操作

    一. 无需实现model.py文件获取实例对象就能直接通过连接数据库进行数据的增删改查操作 # 连接数据库用于查询(查询单个或多个) def db_query(sql):# 打开数据库连接db = p ...

  4. express 对数据库数据增删改查

    接着 http://www.cnblogs.com/cynthia-wuqian/p/6560548.html (1)概念 Schema(属性) :一种以文件形式存储的数 据库模型骨架,不具备数据库的 ...

  5. 欢迎来到Jsp编程课时十二——今天实现的目标是。@1将数据库的数据发送到浏览器。@2利用浏览器实现对数据库的增删改查操作。@3理解MVC三层架构的定义。

    完成项目会有以下的效果. JSP第二十课:Mvc+Mysql+Servlect+Jsp实现在浏览器上对数据库的增删改查. MVC全名是Model View Controller, 是 @@1模型(mo ...

  6. shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)

    shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)Shell脚本与MySQL数据库交互(增删改查)# 环境准备:安装mariadb 数据库 [root ...

  7. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. 通过Loadruner对mysql数据库进行增删改查

    通过Loadruner对mysql数据库进行增删改查 操作mysql数据库,是在实现mysql数据源配置的基础上操作,可先阅读:loadrunner参数化使用mysql数据源失败解决方法 写之前先理一 ...

  9. Springboot使用JPA框架对数据库实现增删改查(附详细代码)

    前言 1.本文将详细阐述如何使用JPA框架对数据库实现增删改查操作,业务中比较常见的应用场景几乎在这里都能看到,并且有详尽的代码可供直观演示,其中遇到的坑也进行了实时标注. 2.JPA的环境配置在前面 ...

最新文章

  1. 中石油训练赛 - Count the Even Integers(Java高精度运算+找规律)
  2. spring-boot注解详解(一)
  3. 教资科目一要背的内容 0303
  4. 上海市高等学校信息技术水平二三级python 模拟题 编程
  5. 「How The Economic Machine Works」《经济机器是如何运转的》中文字幕
  6. 网站PV,UV是什么意思?
  7. 央行:个人征信基本实现金融信用信息广覆盖
  8. 查询具体详情 数据后面拼接属性
  9. Opencv 16位深度图片显示并保存
  10. 【算法导论】 内部排序算法总结
  11. window.open打开新标签页面
  12. (附源码)计算机毕业设计黄淮学院二手物品交易平台
  13. SQL语句--关于赋值
  14. 理论物理极础4:质点系
  15. 古城南京,加“数”前进——CDEC2021中国数字智能生态大会走进南京
  16. 【Python 教程】11_基础数据类型
  17. 博士后的那些套路,那些坑
  18. flex布局 flex全解 flex
  19. 2021.12- 参加第四届海淀区青少年科普科幻创作活动(一等奖)
  20. 在乌版图安装软件包时候报错:E:无法定位软件包

热门文章

  1. 页面适配的小栗子 - github
  2. 毕业设计——学术交流管理系统的设计与实现-1
  3. Linux文件属性和权限
  4. 织梦多个栏目arclist调用副栏目不显示的解决办法
  5. CentOS最小化系统,怎么安装图形界面
  6. js中如何通过身份证号计算出生日期和年龄
  7. CAN总线基础(二)——CAN总线物理层介绍(总线电压详解)
  8. STM32:Flash擦除与读写操作(HAL库)
  9. 十五、稀疏矩阵的乘法运算
  10. mysql按章_mysql按时间范围分区