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. django学习01-建project和app

    按装完成后,执行命令 django-admin startproject mysite 建一个名字为mysite的工程.运行 python manage.py runserver 启动网络服务器,然后 ...

  2. 基于iCamera测试mt9m034 1280X960 高动态相机模块小结

    基于iCamera测试mt9m034 高动态相机模块小结 首先看看此模块的特性 mt9m034 高动态 CMOS模块 1280*960像素 5.48 V/lux-sec >115db 摄像头模块 ...

  3. iSensor APP 之 摄像头调试 OV5642

    iSensor APP 之 摄像头调试  OV5642 iSensor app 非常适合调试各种摄像头,已测试通过的sensor有: l  OV7670.OV7725.OV9650.OV9655.OV ...

  4. [状态模式]实现stopwatch

    1.模拟传统面向对象语言的状态模式实现 // Stopwatch类 状态机class Stopwatch {    constructor() {        this.button1 = null ...

  5. Django 09

    目录 多对多三种创建方式 全自动 纯手撸 半自动(推荐) form组件 校验数据 渲染标签 展示错误信息 validators校验器 钩子函数 补充 多对多三种创建方式 全自动 ManyToManyF ...

  6. 2019最新EI源刊目录

    2D Materials Journal3D Printing and Additive Manufacturing Journal3D Research Journal3DTV-Conference ...

  7. [ASP.NET Core 3框架揭秘] 依赖注入[9]:实现概述

    <服务注册>.<服务消费>和<生命周期>主要从实现原理的角度对.NET Core的依赖注入框架进行了介绍,接下来更进一步,看看该框架的总体设计和实现.在过去的多个版 ...

  8. SVN服务器和客户端的下载和安装

    一.SVN服务器VisualSVN下载和安装 当前版本:4.1.3下载地址:https://www.visualsvn.com/server/download/下载下来的文件:VisualSVN-Se ...

  9. CODING 敏捷看板全新上线,助力研发管理可视化升级

    在服务企业研发团队的过程中,我们发现不少团队碰到了类似的问题: 团队成员声称完成了自己的大部分任务,但团队实际交付的需求却寥寥无几? 由于某些问题导致工序一直处于等待状态,怎么识别和处理这些延迟? 成 ...

  10. 初学Manjaro

    近期,看有朋友在使用Manjaro系统,感觉这个系统挺不错,于是我也安装了Manjaro,学习一下!!!! Manjaro下载地址:https://manjaro.org/download/ Manj ...