今日的内容:

a. 路由系统1. 创建app2. 路由的分组3. 路由的分发-   正则表达式匹配b. django的orm(模型model)1. 创建模型的步骤2. orm基本的增删改查3. 正向查询和反向查询

注意事项:

1. 前台传给后台一个列表时,后端如何接受:request.POST.getlist(字段名)2. 前台传给后台一个列表时,需要在ajax请求中增加一个参数:traditional: true3. 多选框设置选中状态时,可以使用$("select的选择器").val(列表)4. cookie的参数设置obj = render(request,'a.html')obj.set_cookie(key,values,max_age,expires,path,
domain,secure,httponly)
参数详解
"""
key, 键
value=, 值
max_age=None, 超时时间
expires=None, 指定过期时间IE 专用 date = datetime.datetime() expires=date
path='/', cookie有效路径
domain=None, Cookie生效的域名
secure=False, https传输
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
"""
5. 删除Cookie
def logout(request):rep = redirect("/login/")rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值return rep6. 获取Cookie
username = request.COOKIES.get('username')  # 取出登录用户名7. cookie的加盐
#通过加盐的方式为cookie签名。  obj.set_signed_cookie('kkk','vvv',  salt='123456')
#获取经过签名后的cookie值。request.get_signed_cookie('kkk',    salt='123456') 
# 目录结构
migrations  # 模型操作的迁移文件
init
admin       # 管理文件,django admin的时候会用到
apps        # 应用信息定义文件,在其中生成了类AppCongfig,该类用于定义应用名等Meta数据
models      # 添加模块层数据类的文件,orm框架时使用
tests       # 测试代码文件
views       # 视图文件

路由分组

对多个视图进行一个分组,比如class为一个组,所有跟class相关的增,删,改,查视图都放在这个app中。各司其职,互不干扰。相比之前把所有的代码写到urls中,功能分划更清晰。

创建app的两种方式:

1. 使用pycharm创建django项目时,可以创建。缺点:只能创建一个
2. 命令行创建python3 manage.py startapp app名称(可创建多个),
  • django使用的什么版本的解释器,就需要用对应的解释器创建app
  • 需要在对应的目录下创建

分组:

第一种方式

a. 项目下的urls.py中

from *** import views
urlpatterns = [url(r'^test/', views.test),
]# 缺点,只能导入一个app,多个app会导致名称空间被污染
第二种方式
  1. django项目下的urls.py文件,注意:需要导入include模块
from django.conf.urls import url,includeurlpatterns = [url(r'^classes/',inclued("classes.urls")),url(r'^student/',inclued("student.urls")),url(r'^teacher/',inclued("teacher.urls"))
]
  1. 在对应的app下,创建一个urls.py文件

  2. 对应app的urls.py

form django.conf.urls import urlfrom classes import viewsurlpatterns = [url(r'^get_classes/',views.get_classes),
]
  1. 对应app下的views.py文件内容为:
from django.shortcuts import render,HttpResponse# Create your views here.def get_classes(request):return HttpResponse("get_classes")

第二种方式的总结:

  • 客户端访问127.0.0.1:8000/classes/get_classes时,先进入到项目下的urls.py文件进行匹配
  • 根据项目下urls.py中的对应关系,进入到各个app项目下的urls.py文件中进行匹配
  • 根据各个app下的urls.py中的对应关系,匹配成功请求路径后,执行对应app项目下views.py文件下的函数。

路由分发

from app01 import views
urlpatterns = [url(r'^test/(?P<id>\w+)/(?P<name>\w+)', views.test),
]# app01项目下views.py文件:
def test(request,name,id):print(name)print(id)return HttpResponse("test")# 浏览器访问
http://127.0.0.1:8000/test/0123/plf# -------------------------views.py中打印结果---------------------
plf
0123

当浏览器中输入一个不存在的地址时,我们可以在浏览器中匹配对应的路径,然后为不存在的url,专门设置一个页面

from app01 import views
urlpatterns = [url(r'^', views.notfound),
]
反向路由

当一个路径很长的时候,我们可以在路由系统中,设置一个变量a,用来代替这个路径,之后我们在form表单中action中写入{% url "a" %}即可.

# 路由系统中的写法
urlpatterns = [url(r'^logindbsjhalbdhaskbhdkjsabhdkbashkdbhsabdhsja/$', views.login, name='test'),
]# 对应的html的页面中写法:
<form action="/test/" method="post"><input type="text">
</form>

django中请求处理方式有2种:FBV 和 CBV

第一种:FBV(function base views)

就是在视图里使用函数处理请求

urls.py
from django.conf.urls import url, include
# from django.contrib import admin
from mytest import viewsurlpatterns = [# url(r'^admin/', admin.site.urls),url(r'^index/', views.index),
views.py
from django.shortcuts import renderdef index(req):if req.method == 'POST':print('method is :' + req.method)elif req.method == 'GET':print('method is :' + req.method)return render(req, 'index.html')

第二种:CBV(class base views)

就是在视图里使用类处理请求。

urls.py
from mytest import viewsurlpatterns = [# url(r‘^index/‘, views.index),url(r‘^index/‘, views.Index.as_view()),
]# 注:url(r‘^index/‘, views.Index.as_view()),  是固定用法。
views.py
from django.views import Viewclass Index(View):def get(self, req):print('method is :' + req.method)return render(req, 'index.html')def post(self, req):print('method is :' + req.method)return render(req, 'index.html')# 注:类要继承 View ,类中函数名必须小写。
'''
'get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'
form 只支持 post和 get
ajax 支持 所有的方法
'''

ORM框架

1. 先配置mysql的连接地址

# 在settings.py文件中,写入自己需要连接的数据库
DATABASES = {
# 'default': {
#     'ENGINE': 'django.db.backends.sqlite3',
#     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'orm',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '192.168.81.161',
'PORT': '3306',
}
}

2. 在app中的__init__.py文件中导入pymysql模块

import pymysql
pymysql.install_as_MySQLdb()

3. 在app项目下models.py文件中创建表.一个类一个表

# 类需要继承models.Modelfrom django.db import models
# Create your models here.
class UserInfo(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=32)age = models.CharField(max_length=32)ut = models.ForeignKey("UserType",null=True)

4. 修改配置文件

​ 把我们的应用添加到对应的settings.py的INSTALLED_APPS 中:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'****',    #我们创建的应用
]

4. 创建表

python manage.py makemigrations  ## 生成迁移文件
python manage.py migrate   ## 生成实际的表ps: 如果修改了models.py中的代码,需要重新执行上面的两行代码

5. 基本操作

第一种方式
models.users.objects.create(username='xsmile',password=12345)第二种方式
a = {'username':"plf",'passsword':'123456'}
models.users.objects.create(**a)第三种方式:插入多条数据
info = [models.UserInfo(name="root1",age=34,ut_id=1),models.UserInfo(name="root2",age=34,ut_id=2),models.UserInfo(name="root3",age=34,ut_id=3),models.UserInfo(name="root4",age=34,ut_id=4),models.UserInfo(name="root5",age=34,ut_id=5),models.UserInfo(name="root6",age=34,ut_id=6),models.UserInfo(name="root7",age=34,ut_id=7),
]
models.UserInfo.objects.bulk_create(info)
删除
Test.objects.filter(name__contains='jack').delete()

Test.objects.filter(name__contains='apollo1').update(name='Jack')

单表查询


models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
models.Tb1.objects.filter(name__contains="ven")  # 获取name字段包含"ven"的
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.filter(id__range=[1, 3])      # id范围是1到3的,等价于SQL的bettwen and
类似的还有:startswith,istartswith, endswith, iendswith 
date字段还可以:
models.Class.objects.filter(first_day__year=2017)

多表查询(外键查询)

1. 正向查询(通过关联的字段ut,直接使用点语法获取另外一张表的字段数据)
objs = models.UserInfo.objects.filter(ut_id__gt=2,ut__title="正常员工")
print(objs)
for i in objs:print(f"id:{i.id} {i.name} {i.age}  {i.ut.title}")

正向查询

第一种:按对象查找

语法

对象.关联字段.字段

book_obj = models.Book.objects.first()  # 第一本书对象
print(book_obj.publisher)  # 得到这本书关联的出版社对象
print(book_obj.publisher.name)  # 得到出版社对象的名称

第二种:按照字段查找

语法

关联字段__字段

print(models.Book.objects.values_list("publisher__name"))

反向查询

第一种:按照对象查找

语法

对象.表名_set

publisher_obj = models.Publisher.objects.first()  # 找到第一个出版社对象
books = publisher_obj.book_set.all()  # 找到第一个出版社出版的所有书
titles = books.values_list("title")  # 找到第一个出版社出版的所有书的书名

第二种:按照字段查找

语法

表名__字段

titles = models.Publisher.objects.values_list("book__title")

转载于:https://www.cnblogs.com/plf-Jack/p/11349340.html

django之路由分组,路由分发,FBV,CBV,ORM框架相关推荐

  1. golang学习笔记(19)-gin路由分组和中间件

    gin路由分组和中间件 这里写目录标题 gin路由分组和中间件 路由分组 中间件 使用中间件 创建中间件 简单中间件应用实验 路由分组 路由分组可以使路由结构更加清晰,更加方便管理路由. 官方演示代码 ...

  2. php 前端页面的路由,ThinkPHP5路由

    路由作用 1.根据实现定义的路由规则,检验URL请求,确定执行或者拒绝: 2.路由规则可自定义,隐藏了原URL地址,使访问地址,使访问更安全,地址更优雅. 路由模式 开启路由后,其实只有二中状态,要么 ...

  3. Django(二) 路由和视图

    路由定义 路由是客户端访问的url路径与视图函数间的一一映射关系.Django中的路由关系在urls.py文件中,基本格式如下: urlpatterns = [url(regex,view, kwar ...

  4. django第三天(路由基础和路由分配)

    路由基础 url(正则路径,视图函数地址,默认关键字参数,路由别名) 路由由上而下匹配, ""可以匹配任意路由 "^$"来匹配"/" url ...

  5. 7. django应用及分布式路由

    Django应用及分布式路由 应用详解 什么应用 应用在django项目中是一个独立的业务模块,可以包含自己的路由,视图,模板,模型. 例如网站可以分为 金融.体育.娱乐.政治等, 这些就是应用,说白 ...

  6. Django应用与分布式路由

    应用,项目中的独立业务模块,可以保函自己的路由.视图.模板.模型. 一.创建应用 (一)创建应用文件夹 python manage.py startapp [应用名] (二)settings配置 在s ...

  7. Django(静态文件和Django应用和分布式路由)

    什么是静态文件 如:图片.css.js.音频.视频 静态文件配置 --settings.py中 1.配置静态文件的访问路径[该配置默认存在] STATIC_URL = '/static' 指定访问静态 ...

  8. 徒手撸出一个类Flask微框架(三)根据业务进行路由分组

    所谓分组就是按照前缀分布映射 如: /product/(\w+)/(?P<id>\d+ # 匹配/product/123123 的前缀 比如什么类别,类别下的什么产品 等, 用reques ...

  9. go gin路由分组route group

    package mainimport "github.com/gin-gonic/gin"func main() {r := gin.Default() 路由分组//r.GET(& ...

最新文章

  1. getaddrinfo()函数详解
  2. mysql 4 基础教程_MySQL基础教程(四):MySQL 管理
  3. 一次服务器CPU占用率高的定位分析
  4. android头部固定悬停,Android开发上滑悬停且头部可刷新
  5. Redis:08---字符串对象
  6. enter 默认搜索
  7. 14.卷1(套接字联网API)---高级IO函数
  8. mapxtreme相关
  9. SQLServer数据库处于恢复挂起状态的解决办法
  10. MVC三层架构详细图
  11. win10系统怎么改奇摩输入法_Win10系统如何切换输入法
  12. M3DGIS三维电子沙盘开发教程第52课无人机倾斜摄影全景三维建模
  13. matlab maps 指北针和比例尺,R 地图绘制-比例尺与指北针
  14. solr全文检索(多字段搜索)
  15. 求最大公约数与最小公倍数算法——Java
  16. 怎么_如何制作h5页面?
  17. win7不显示移动硬盘_如何在移动硬盘中安装win10系统?
  18. 100个RPA经典应用场景解析
  19. BIgDecimal的用法,及与各类数据类型的转换
  20. Android 底部导航栏 BottomNavigationBar

热门文章

  1. matlab杜哈梅尔积分,非平稳地震作用下桥梁系统碰撞间隙宽度的概率评价方法与流程...
  2. 生成html_用 Pytest+Allure 生成漂亮的 HTML 图形化测试报告
  3. 小程序源码 租房管理系统_租房小程序解决方案
  4. SpringBoot 工程目录 整合mybatis-neo4j(注解类型)-增删改查
  5. pytorch 回归预测(时间序列)
  6. pytorch_basics
  7. flask 配置静态文件模板文件
  8. 1.10 卷积神经网络示例
  9. tesseract win 训练
  10. editthiscookie