MVC

M: model 模型 与数据库交互

V: view 视图 HTML

C:controller 控制器 流程 和 业务逻辑

MTV

M:model ORM

T:template 模板 HTML

V:view 视图 业务逻辑

Django中的视图

FBV

 def add_publisher(request,*args,**kwargs):
  # 逻辑
  return  response

urls.py

   url(r'^add_publisher',add_publisher )

CBV

 from django.views import View
 class Addpublisher(View):
  def get(self,reuqest,*args,**kwargs)
         # 处理GET请求的逻辑
         self.request
         return  response
     
     def post(self,reuqest,*args,**kwargs)
         # 处理POST请求的逻辑
         return  response

urls.py

   url(r'^add_publisher',Addpublisher.as_view() )

as_view的流程:

  1. 程序加载的时候,执行Addpublisher.as_view():

    定义了一个view函数,返回view

    url(r'^add_publisher',view )

  2. 请求到来时,执行view函数:

    1. 实例化对象 ——》 self

    2. self.request = request

    3. 执行self.dispatch(request, *args, **kwargs)

      1. 判断请求方式是否被允许:

        1. 允许: 通过反射获取请求方式对应的方法(get/post) ——》 handler

        2. 不允许:self.http_method_not_allowed ——》 handler

      2. 执行handler,将它的结果返回

加装饰器的方法:

FBV 直接加

CBV

from django.utils.decorators import method_decorator

 # 加在方法上
 @method_decorator(login_required)
 def get(self, request, *args, **kwargs):
 ​
 # 加在dispatch方法上
 @method_decorator(login_required)
 def dispatch(self, request, *args, **kwargs):
     ret = super().dispatch(request, *args, **kwargs)
     return ret
 ​
 @method_decorator(login_required,name='dispatch')
 class Addpublisher(View)
 ​
 # 加在类上
 @method_decorator(login_required,name='post')
 @method_decorator(login_required,name='get')
 class Addpublisher(View)
 ​

request

 request.method  # 请求方法  GET POST
 request.GET     # url上携带的参数 {} get getlist
 request.POST    # from表单提交POST请求的数据 {} get getlist urlencode
 request.body    # 请求体 bytes
 request.path_info # 当前的路径 不包含IP和端口 也不包含参数
 request.COOKIES  # cookie的数据 {}
 request.session  # session数据 {}
 request.FILES    # 上传的文件   enctype ='multipart/form-data'
 request.META     # 请求头的信息 {} 小写——》大写 HTTP_ - ——》 _
 ​
 request.get_full_path()  # 获取完整的路径 不包含IP和端口 包含参数 ?
 request.get_host()
 request.is_ajax()
 request.get_signed_cookie(key)

response

 HttpResponse('字符串')   # 返回字符串
 render(request,'模板的路径',{})  # 返回一个HTML页面
 redirect('地址')  # 重定向 响应头 Location:地址 状态码 301 302
 ​
 from django.http.response import JsonResponse
 JsonResponse({})  # content-type: application/json
 JsonResponse([],safe=False)

模板:

变量 {{ 变量名 }}

.key > .属性 .方法 > .索引

filter

{{ 变量|filter:参数 }}

default add length slice join first last lower upper title truncatechars truncatewords

date:"Y-m-d H:i:s" safe

 USE_L10N = False
 DATETIME_FORMAT = 'Y-m-d H:i:s'

标签 tag {% %}

for

 {% for i in list  %}
  {{ forloop }}
  {{ i }}
 {% endfor %}

forloop.counter 循环的序号 从1开始

forloop.counter0 循环的序号 从0开始

forloop.revcounter 循环的序号 到1结束

forloop.revcounter0 循环的序号 到0结束

forloop.first 是否是第一次循环

forloop.last 是否是最后一次循环

forloop.parentloop 当前循环的外层循环 {}

 {% for i in list  %}
  {{ forloop }}
  {{ i }}
 
 {% empty %}
  空空如也
 {% endfor %}

if

 {% if  条件  %}
  x
 {% elif 条件1 %}
  xx
 {% else %}
  xxx
 {% endif %}

注意点:

  1. 不支持算数运算

  2. 不支持连续判断 10 > 5 > 1 false

csf_token

把{% csrf_token %}放在form表单中,form表单中就有一个隐藏的input框(name='csrfmiddlewaretoken'),就可以提交post请求

母版和继承

  1. 母版

将公共的部分提取出来——》 HTML ,在页面中定义block块,让子页面进行替换

  1. 继承

    1. 在子页面中第一行写{% extends '母版的名字' %}

    2. 重写block块

组件:

把一小段的HTML代码段 ——》 nav.html

 {% include 'nav.html ' %}

静态文件的使用:

 {% load static %}
 "{% static '静态文件的相对路径' %}"

ORM

对应关系:

类 ——》 表

对象 ——》 数据行

属性 ——》 字段

常用的字段:

 AutoField  自增字段
 IntegerField 整数
 CharField 字符串
 DatetimeField DateField 日期时间
  auto_now:每次修改时修改为当前日期时间。
  auto_now_add:新创建对象时自动添加当前日期时间。
 BooleanField 布尔值
 TextField   大文本
 ImageField 图片
 DecimalField   10进制小数

字段参数

 null=True   # 数据库中该字段可以为空
 blank=True # 用户输入可以为空
 db_column   # 数据库字段的名
 default     # 默认值
 primary_key # 主键
 db_index   # True 索引
 unique     # 唯一约束
 verbose_name   # 中文提示
 choices       # 让用户选择的数据

表的参数

     class Meta:
        # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
        db_table = "person"
 ​
        # # admin中显示的表名称
        verbose_name = '个人信息'
 ​
        # verbose_name加s
        verbose_name_plural = '所有用户信息'
 ​
        # 联合索引
        # index_together = [
        #     ("name", "age"), # 应为两个存在的字段
        # ]
        #
        # # 联合唯一索引
        unique_together = (("name", "age"),) # 应为两个存在的字段

使用admin的步骤:

  1. 创建超级用户

    python manage.py createsuperuser

  2. 注册model

    在app下的admin.py中注册

     from django.contrib import admin
     from app01 import models
     # Register your models here.
     admin.site.register(models.Person)
  3. 访问网站登录操作

必知必会13条:

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django

django.setup() # 初始化

from app01 import models

# all() 查询所有的数据 QuerySet 对象列表
ret = models.Person.objects.all()

# filter 获取满足条件的所有的对象 QuerySet 对象列表
ret = models.Person.objects.filter(name='alex')

# exclude 获取不满足条件的所有的对象 QuerySet 对象列表
ret = models.Person.objects.exclude(name='alex')

# values()
# 不指定字段 获取所有字段名和值 QuerySet 对象列表 [ {},{} ]
# 指定字段 values('pid','name') 获取指定字段名和值 QuerySet 对象列表 [ {},{} ]
ret = models.Person.objects.all().values()
ret = models.Person.objects.filter(name='alex').values('pid', 'name')

# values_list()
# 不指定字段 获取所有的值 QuerySet 对象列表 [ (),() ]
# 指定字段 values_list('pid','name') 获取指定的值 QuerySet 对象列表 [ (),() ]
ret = models.Person.objects.all().values_list()
ret = models.Person.objects.filter(name='alex').values_list('name', 'pid', )

# order_by 排序 默认升序 -降序 可以多个字段排序
ret = models.Person.objects.all().order_by('age', '-pid')

# reverse 对已经排序的QuerySet做的反转
ret = models.Person.objects.all().order_by('pid').reverse()

# get 获取满足条件的一个的对象 对象
ret = models.Person.objects.get(name='alex')

# first 获取第一个元素 对象 获取不到的时候是none
ret = models.Person.objects.filter(name='xxx').first()

# last 获取最后一个元素 对象 获取不到的时候是none
ret = models.Person.objects.filter(name='xxx').last()

# count 计数
ret = models.Person.objects.all().filter(age=84).count()

# exists 数据是否存在
ret = models.Person.objects.filter(age=84).exists()

# distinct 去重 数据时完全一样才去重
ret = models.Person.objects.filter(age=84).values('age').distinct()

 """
 返回对象列表
 all
 filter
 exclude
 order_by
 reverse
 values   [{}]
 values_list   [()]
 distinct  
 ​
 返回对象
 get
 first  
 last
 ​
 返回数字
 count
 ​
 返回布尔值
 exists
 ​
 """ 单表的双下划线:

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django

django.setup() # 初始化

from app01 import models

ret = models.Person.objects.filter(pk__gt=3) # greater than where pk > 3
ret = models.Person.objects.filter(pk__gte=3) # greater than equal where pk >= 3

ret = models.Person.objects.filter(pk__lt=3) # less than where pk < 3
ret = models.Person.objects.filter(pk__lte=3) # less than equal where pk <= 3

ret = models.Person.objects.filter(pk__range=[1,3]) # 1 <= pk <= 3
ret = models.Person.objects.filter(pk__in=[1,3,7,10,100]) # 成员判断

ret = models.Person.objects.filter(name__contains='bigbao') # like 不忽略大小写
ret = models.Person.objects.filter(name__icontains='bigbao') # like ignore 忽略大小写

ret = models.Person.objects.filter(name__startswith='b') # 以什么开头 不忽略大小写
ret = models.Person.objects.filter(name__istartswith='b') # 以什么开头 忽略大小写

ret = models.Person.objects.filter(name__endswith='o') # 以什么结尾 不忽略大小写
ret = models.Person.objects.filter(name__iendswith='o') # 以什么结尾 忽略大小写

ret = models.Person.objects.filter(age__isnull=False) # 字段是否为空

ret = models.Person.objects.filter(birth__year='2019') # 按照年份
ret = models.Person.objects.filter(birth__contains='2019-12-19') # 时间包含

print(ret)

外键的操作:

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django

django.setup() # 初始化

from app01 import models

# 基于对象的查询
# 正向查询
book_obj = models.Book.objects.get(pk=3)
# print(book_obj)
# print(book_obj.pub)

# 反向查询
# 没有指定related_name 表名小写_set
pub_obj = models.Publisher.objects.get(pk=2)
# print(pub_obj.book_set,type(pub_obj.book_set)) # 关系管理对象
print(pub_obj.book_set.all())

# related_name='books'
# print(pub_obj.books.all())

# 基于字段的查询
ret = models.Book.objects.filter(pub__name='老男孩出版社')
# print(ret)

# 没有指定related_name 类名小写__字段
ret = models.Publisher.objects.filter(book__name='没有页码的python书')
# 指定related_name related_name__字段
ret = models.Publisher.objects.filter(books__name='没有页码的python书')

# 指定related_query_name='book' related_query_name_name__字段
# ret = models.Publisher.objects.filter(book__name='没有页码的python书')
# print(ret)

多对多的操作:

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django

django.setup() # 初始化

from app01 import models

author_obj = models.Author.objects.get(pk=1)

# print(author_obj.books.all())

book_obj = models.Book.objects.get(pk=1)
# print(book_obj.author_set.all())

ret = models.Author.objects.filter(books__name='没有页码的python书')
ret = models.Book.objects.filter(author__name='bigbao')

# print(ret)
# set 设置多对多的关系 [id] [对象]
# author_obj.books.set([3,])
# author_obj.books.set( models.Book.objects.all()) # [对象,对象]

# add 添加多对多的关系 id 对象
# author_obj.books.add(1,2,3)
# author_obj.books.add(*models.Book.objects.all()) # *[对象,对象]

# remove 删除多对多的关系 id 对象
# author_obj.books.remove(1,2)
# author_obj.books.remove(*models.Book.objects.filter(pk__in=[1,2])) # [对象,对象]

# clear 清除多对多的关系
# author_obj.books.clear()

# create 新增一个所关联的对象 并且和当前的对象设置关系
author_obj.books.create(name='跟和尚学合气道', pub_id=1)

# book_obj.author_set

# 多对一 反向查询 一 ——》 多 关系管理对象
# 关系管理对象.set([对象,对象])
# 关系管理对象.add(对象,对象)

# 外键字段 null=True, 才有remove,clear
# 关系管理对象.remove(对象,对象)
# 关系管理对象.clear()

# 关系管理对象.create()

使用admin的步骤、必知必会13条、单表的双下划线、外键的操作、多对多的操作:的更多相关文章

  1. Django ORM 操作 必知必会13条 单表查询

    ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...

  2. makefile 必知必会

    Makefile 必知必会 Makefile的根本任务是根据规则生成目标文件. 规则 一条规则包含三个:目标文件,目标文件依赖的文件,更新(或生成)目标文件的命令. 规则: <目标文件>: ...

  3. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  4. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

  5. makefile 必知必会以及Makefile是怎样炼成的

    Make必知必会原文链接 Makefile 必知必会 Makefile的根本任务是根据规则生成目标文件. 规则 一条规则包含三个:目标文件,目标文件依赖的文件,更新(或生成)目标文件的命令. 规则: ...

  6. RecyclerView 必知必会(转)

    [腾讯Bugly干货分享]RecyclerView 必知必会 本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com ...

  7. 第4节:Java基础 - 必知必会(中)

    第4节:Java基础 - 必知必会(中) 本小节是Java基础篇章的第二小节,主要讲述抽象类与接口的区别,注解以及反射等知识点. 一.抽象类和接口有什么区别 抽象类和接口的主要区别可以总结如下: 抽象 ...

  8. MySQL必知必会1-20章读书笔记

    MySQL备忘 目录 目录 使用MySQL 检索数据 排序检索数据 过滤数据 数据过滤 用通配符进行过滤 用正则表达式进行搜索 创建计算字段 使用数据处理函数 数值处理函数 汇总数据 分组数据 使用子 ...

  9. 【MySQL 基础】MySQL必知必会

    MySQL必知必会 简介 <MySQL必知必会>的学习笔记和总结. 书籍链接 了解SQL 数据库基础 什么是数据库 数据库(database):保存有组织的数据的容器(通常是一个文 件或一 ...

随机推荐

  1. 大数据项目2(Java8聚合操作)

    前言:为很好的理解这些方法,你需要熟悉java8特性Lambda和方法引用的使用 一:简介 我们用集合的目的,往往不是简单的仅仅把数据保存哪里.而是要检索(遍历)或者去计算或统计....操作集合里面的 ...

  2. spf13-vim 显示neocomplete requires ...th Lua support

    安装spf13-vim的时候下载了许多插件,neocomplete应该是比较重要的一个,毕竟自动补全.但是在使用时却一直有:neocomplete requires ...th Lua support ...

  3. 《Dotnet9》系列-开源C# WPF控件库1《MaterialDesignInXAML》强力推荐

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  4. 2019 ECfianl

    这真的是一次失败的旅行,不过也有所收获. 我也是醉了,真的是,热身赛的时候对面队伍把B题快快的过了,就开始在那里说个不停,真的是超级烦(以为他们是个大佬队) 第二天正式赛了,他们过了两题,就没有了,( ...

  5. Django forms组件里的ChoiceField、ModelChoiceField和ModelMutipleChoiceField的区别

    阅读简要 首先我们要明白Django forms组件里的ChoiceField.ModelChoiceField和ModelMutipleChoiceField是继承关系 ChoiceField 1. ...

  6. 医院信息集成平台(ESB)数据集成建设方案

    一.数据资产目录建设 依据卫生部信息化工作领导小组办公室卫生部统计信息中心2011年3月发布的<基于电子病历的医院信息平台建设技术解决方案——业务部分>. 临床服务域 包含12个二级类目: ...

  7. Vue.js实现大文件分片md5断点续传

    背景 根据部门的业务需求,需要在网络状态不良的情况下上传很大的文件(1G+).其中会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长,请求超时:3,传输中断,必须重新上传导致前功尽 ...

  8. Linux MySQL的root无法登录数据库ERROR 1045 (28000)

    Linux环境下,脚本自动安装完数据库,命令行用mysql -uroot -ppasswaord 登录却报了这么个错: ERROR 1045 (28000): Access denied for us ...

  9. windows 安装xps查看器; windows 10 安装 xps viewer

    最近发现windows 默认是没有xps 查看器的,需要自己手动添加: 安装完成后,即可使用: 参考链接:https://www.windowscentral.com/how-get-xps-view ...

  10. docker拉取慢(net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting head)

    systemctl restart docker在docker-hub拉取慢,因为服务器在外网 直接配置阿里云镜像就可以 首先: vim /etc/docker/daemon.json加入下面的那句 ...