可视化界面之数据增删改查

在模型类中定义双下str方法可以在数据对象被执行打印操作的时候方便的查看

self应该是字段对象 print(对象)时会触发__str__

并且这个方法的return一定要返回字符串类型的数据

触发提交动作的按钮:

'''
form表单中能够触发提交动作的按钮只有两个
<input type='submit'/>
<button></button> ps: reset重置按钮
'''

1.建表

建表、加索引可以体现程序员的工作经验。

建表之前需要考虑,极端情况下 这个字段最多能存多少数据?

字段长度短了会导致服务出问题,字段长度长了会占用空间,浪费资源

在model.py使用ORM建表时,可以在类中不写主键字段(id),django会自动帮你创建一个名为id的主键字段。

可以在models.py中给字段添加注释 比如age字段 可以通过另外的方式查看字段的意义:



方式1.在mysql中使用show create table 表名可以查看注释

方式2.mysql中有缓存表可以看

2.数据展示功能

开设接口、获取数据、传递页面、展示数据

数据展示页面示例:



数据展示页表格html:



针对数据对象主键字段的获取可以使用更加方便的 obj.pk获取

3.数据添加功能

开设接口、获取数据、发送数据、校验数据、录入数据、重定向

我们点击a标签按钮,跳转到数据添加页面,进行添加数据。

a标签相当于朝你指定的页面发送get请求:



数据添加页表单:



数据添加views层:



TODO是协同开发的时候用的 每天开发的代码要上传到网络

上传代码时,这个todo会弹出来,给你提供一些提示。

添加逻辑判断,添加成功之后,重定向到数据展示页面:

4.数据编辑功能

开设接口、后端如何区分所要编辑的数据(问号携带参数)、后端获取用户数据、前端展示默认数据、获取用户并完成更新

编辑用户信息的时候 如何让新页面知道 你想编辑的是哪个用户?

a标签默认发送get请求 我们可以使用get请求携带一些信息。

携带主键值:



示例:



数据编辑views:

使用request.GET.get获取get请求问号后面携带的主键值。



targetEditPage: 将后端通过id值查到的数据 塞到数据添加页面表单的默认值(value)里面去!



views添加相关逻辑:

5.数据删除功能

开设接口、问号携带参数、删除二次确认

扩展1:在数据表中新建一个枚举字段,用于表示数据是否被删除,如果删除则将此字段变为false。数据展示的时候不展示false的数据。

扩展2:删除的时候可以在前端写一个模态框进行二次确认

用get请求给后端传递主键值,告知数据库到底要删除哪个数据



在views层接收主键值,调用数据库执行删除操作:



添加模态框。给a标签添加类名,注意这里因为在循环中,所以不能添加id属性。



当模态框获取用户输入的结果是false时,使用return false取消a标签的默认事件:

django请求生命周期流程图


学习流程
路由层、视图层、模板层、模型层、组件、BBS项目

django路由层

1.路由匹配

django2.X及以上 path第一个参数写什么就匹配什么

django1.X第一个参数是正则表达式

无论什么版本django都自带加斜杠后缀的功能 也可以取消

也就是说:django会帮你加斜杠重新给你从上到下匹配一次,一共匹配两次





第一次请求匹配失败:



配置文件中设置APPEND_SLASH = False可以取消这个特性但是建议不要这么做:

2.转换器功能 path

正常情况下很多网站都会有很多相似的网址 如果我们每一个都单独开设路由不合理

用django设置路由 这路由太多了不太合适

我们不可能一个接口一个接口的写啊 相似的接口要整合在一起

django2.X及以上版本路由动态匹配有转换器(五种)

str:匹配除路径分隔符外的任何非空字符串。
int:匹配0或者任意正整数。
slug:匹配任意一个由字母或数字组成的字符串。
uuid:匹配格式化后的UUID。
path:能够匹配完整的URL路径
ps:还支持自定义转换器(自己写正则表达式匹配更加细化的内容)

路由不是写死的 而是动态变化的 django提供相应的功能--> 转换器

转换器 : 将对应位置匹配到的数据转换成固定的数据类型

  path('index/<str:info>/', views.index_func),
# index_func(实参request对象,info='转换器匹配到的类型转换之后的内容')
path('index/<str:info>/<int:id>/', views.index_func)
# index_func(实参request对象,info='转换器匹配到的类型转换之后的内容',id='转换器匹配到的类型转换之后的内容')

转化器的info会当做位置参数传给视图函数:



在views层接收传来的info:

3.正则匹配

django2.X及以上版本有re_path 第一个参数是正则

匹配的本质是只要第一个正则表达式能够从用户输入的路由中匹配到数据就算匹配成功会立刻停止路由层其他的匹配直接执行对应的视图函数

示例:re_path('^test/$', views.test)

举例说明:

对于如下re_path,只要目标字符串中 有test/就能匹配成功



django1.X路由匹配使用的是url() 功能与django2.X及以上的re_path()一致。

django1.x首页的路由应该这样写:

4.正则匹配的无名有名分组

无名分组

无需给匹配条件取名字。

re_path('^test/(\d{4})/', views.test)

会将括号内正则匹配到的内容当做位置参数传递给视图函数(一个括号对应一个位置实参)

接受时候的形参无所谓,可以自己取名。

有名分组

re_path('^test/(?P<year>\d{4})/', views.test)

会将括号内正则匹配到的内容当做关键字参数传递给视图函数 year=\d{4}匹配到的内容

注意上述的分组不能混合使用!!! 不能同一个路由 既使用无名分组 又使用有名分组

反向解析

为什么要有反向解析?

当项目特别庞大 很多页面 都写了a标签进行跳转 a标签都指向同一个路由:

如果我们换路由 会将之前所有a标签全部失效!

总不能手动一个个换吧。所以要使用反向解析。

基本使用

通过一个名字可以反向解析出一个结果 该结果可以访问到某个对应的路由

1.路由匹配关系起别名


path('login/', views.login, name='login_view')

2.反向解析语法

	html页面上模板语法	{% url 'login_view' %}
后端语法 reverse('login_view')

使用模板语法,当路由改变时,a标签能通过名字login_name找到这个名字对应的路由,也动态的进行改变:



后端使用reverse反向解析:



动态路由的反向解析

path('func1/<str:others>/', views.func1_func, name='func1_view')
html页面上模板语法 {% url 'func1_view' 'jason' %}
后端语法 reverse('func1_view', args=('嘿嘿嘿',))

动态路由的情况下正常情况是无法解析的,因为构成这个路由的结果可能有,无数个。

要把动态的部分确定下来,必须得传一个具体的值(这个值可以对象点name 传数据的主键值):



如果有两个动态的参数,就传两个,用空格隔开。

后端语法:



通过args传位置参数,将动态的部分确定下来。

ORM增删改查 django请求生命周期图 django路由层及反向解析的更多相关文章

  1. django之路由层(反向解析)总结

    表关系的建立方式 表与表之间的关系就三种 一对一 OneToOne(to='') # to后面可以跟字符串的表名 也可以直接跟变量名表名(该表名必须在上面提前定义出来) 一对多 ForeignKey( ...

  2. Django框架(三)—— orm增删改查、Django生命周期

    目录 orm增删改查.Django生命周期 一.orm介绍 二.orm增删改字段 三.Django生命周期 orm增删改查.Django生命周期 一.orm介绍 1.什么是orm ORM即Object ...

  3. 饮冰三年-人工智能-Python-24 Django ORM增删改查

    一:首先使用默认的sqlite3创建表 1:现在在models.py中添加表模型 from django.db import models # Create your models here. cla ...

  4. ORM增删改查并发性能测试2

    前言 上一篇<ORM增删改查并发性能测试>出现了点小失误,有的输出SQL日志的代码没有禁用,数据库连接字符串可能有问题.统一环境,统一代码后,重新写一篇. 这次重点是并发性能测试,真不是为 ...

  5. Django框架(三)-- orm增删改查、Django生命周期

    一.orm介绍 1.什么是orm ORM即Object Relational Mapping,全称对象关系映射. 2.使用orm的优缺点 优点: 不用写SQL语句 开发效率高 缺点: SQL的效率低 ...

  6. django ORM 增删改查 模糊查询 字段类型 及参数等

    ORM 相关 #sql中的表 #创建表: CREATE TABLE employee( id INT PRIMARY KEY auto_increment , name VARCHAR (), gen ...

  7. Django 自带的ORM增删改查

     通过Django来对数据库进行增删改查 1 首先创建类,在app应用程序里面的model模块里面创建类,写好数据库信息,方便我们待会初始化: 2 创建在django项目里面的settings里面添加 ...

  8. day054 组件 CBV FBV 装饰器 ORM增删改查

    组件: ​ 把一小段HTML 放在一个HTML中 nav.html ​ 使用: ​ {% include ‘nav.html ’ %} 一. FBV 和CBV 1.FBV(function base ...

  9. ORM增删改查

    目录 orm django 连接mysql顺序 1 settings配置文件中 2 项目文件夹下的init文件中写上下面内容, 补充 3 models文件中创建一个类(类名就是表名) 4.执行数据库同 ...

  10. ORM增删改查并发性能测试

    这两天在对一些ORM进行性能测试(涉及SqlSugar.FreeSql.Fast.Framework.Dapper.LiteSql),测试用的是Winform程序,别人第一眼看到我的程序,说,你这测试 ...

随机推荐

  1. 工厂数字化转型离不开 MES 的原因是什么?

    工厂数字化转型是离不开 MES,首先得弄清楚什么是工厂数字化转型.什么是MES,它们的关系是怎样的. 数字化的主要含义是构建"业务数字化.数字资产化.资产服务化.服务业务化"闭环, ...

  2. NSIS Studio2.1汉化版

    这个东西早些时候是我从老外那里下载回来后放在了群共享里面,中间跟着作者的节奏更新了几次,后来和LmTec聊这个软件的时候提出了汉化的设想,可能是LmTec兄弟看这个软件确实不错,就一口答应了下来,结果 ...

  3. java中的自动拆装箱与缓存(Java核心技术阅读笔记)

    最近在读<深入理解java核心技术>,对于里面比较重要的知识点做一个记录! 众所周知,Java是一个面向对象的语言,而java中的基本数据类型却不是面向对象的!为了解决这个问题,Java为 ...

  4. 生产系统CPU飙高问题排查

    现状 生产系统CPU占用过高,并且进行了报警 排查方法 执行top命令,查看是那个进程导致的,可以确定是pid为22168的java应用导致的 执行top -Hp命令,查看这个进程的那个线程导致cpu ...

  5. 京东云开发者|mysql基于binlake同步ES积压解决方案

    1 背景与目标 1.1 背景 国际财务泰国每月月初账单任务生成,或者重算账单数据,数据同步方案为mysql通过binlake同步ES数据,在同步过程中发现计费事件表,计费结果表均有延迟,ES数据与My ...

  6. C#与Halcon联合编程之用PictureBox控件替代HWindowControl控件

    在使用HALCON和C#联合编程,有时候要使用halcon的HWindowControl控件,但是我发现,HWindowControl的图片显示控件,不能使用GDI+绘制ROI,不知道为什么,反正我测 ...

  7. 基于实战的Burp Suite插件使用Tips

    基于实战的Burp Suite插件使用技巧 本篇文章首发于奇安信攻防社区 目录 基于实战的Burp Suite插件使用技巧 免责声明: 0×00前言 0×01专业版激活 0×02插件的环境安装 0×0 ...

  8. Crond服务+Shell实现秒级任务

    服务 [root@19-v1-centos-6 ~]# chkconfig --list | grep crond crond 0:off 1:off 2:on 3:on 4:on 5:on 6:of ...

  9. Mybatis-plus多数据源 + 数据库连接明文加密

    核心依赖 <!--mybatis-plus 核心组件--> <dependency> <groupId>com.baomidou</groupId> & ...

  10. Java lambda表达式基本使用

    代码示例:java.lambda.LambdaExpression 1 本质 lambda表达式本质上是对匿名内部类实例的一种简化写法. 1.1 案例 有以下List<Integer>对象 ...