一、CBV源码解析

# 在urls中CBV是这么写的
url(r'^myclass',views.Myclass.as_view()) #myclass是我们自己写的类,继承了View,这里类调用as_view这个方法,先要判断这个方法是什么方法
'''
在源码中可以看到 @classonlymethod
def as_view(cls, **initkwargs):
这说明我们找的这个函数,它是类的绑定方法,先会把我们自定义的类当做第一个参数传入
然后我们可以看到这个as_view的返回值是view函数,我们在去看view是什么
'''
def view(request, *args, **kwargs):
self = cls(**initkwargs)
# cls 是我们自己定义的类
if hasattr(self, 'get') and not hasattr(self, 'head'):
# 对类的一些属性进行赋值
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
# 这里又看到一个新的函数dispatch,点击跳转
return self.dispatch(request, *args, **kwargs) def dispatch(self, request, *args, **kwargs):
# 判断这个请求是不是在http_method_names中,往上翻可以看到http_method_names是一个存放请求名字的列表,不过都是小写的
if request.method.lower() in self.http_method_names:
# 这里写了一个getattr用字符串来操作对象的属性或方法
# handler = getattr(自己写的类产生的对象,'get',当找不到get属性或者方法的时候就会用第三个参数),显然,我们在定义自己的类的时候,就要求要写对应的get请求方法和post请求方法,此处的代码让我们可以直接调用对应的请求方法,无需判断
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)

二、模版语法

1 传值

{{}}:变量相关

{% %}:逻辑相关

def index(request):
# 模版语法可以传递的后端python数据类型
n = 123
f = 11.11
s = '我也想奔现'
b = True
l = ['小红','姗姗','花花','茹茹']
t = (111,222,333,444)
d = {'username':'jason','age':18,'info':'这个人有点意思'}
se = {'晶晶','洋洋','嘤嘤'}
# 以上所有的数据类型都可以直接展示到页面上 def func():
return 'Nihao'
# 函数在模版语言中不能加括号,也是写名字,显示的是返回值 class MyClass():
def get_self(self):
return 'self' @staticmethod
def get_func():
return 'func' @classmethod
def get_class(cls):
return 'cls'
obj = MyClass()
# 模版语言会自动判断这个名字能不能加()调用,如果可以的话,返回调用结果的返回值,此处类的调用返回的是实例化对象的内存地址
# 也可以通过类或者对象访问内部的方法,得到的也都是返回值
# 模版语言的取值用的是‘句点符’
{{d.username}} # 字典.key
{{l.0}} # 列表.索引
# 也可以连着点,只要不违反规范,此处即使点不到也不会报错 <p>{{ n }}</p>
<p>{{ f }}</p>
<p>{{ s }}</p>
<p>{{ b }}</p>
<p>{{ l }}</p>
<p>{{ d }}</p>
<p>{{ t }}</p>
<p>{{ se }}</p>
<p>传递函数名会自动加括号调用 但是模版语法不支持给函数传额外的参数:{{ func }}</p>
<p>传类名的时候也会自动加括号调用(实例化){{ MyClass }}</p>
<p>内部能够自动判断出当前的变量名是否可以加括号调用 如果可以就会自动执行 针对的是函数名和类名</p>
<p>{{ obj }}</p>
<p>{{ obj.get_self }}</p>
<p>{{ obj.get_func }}</p>
<p>{{ obj.get_class }}</p>

2 过滤器(最多只能传两个参数)

过滤器就想当于模版语法内置的 内置方法

django内置有60多个过滤器,这里只了解10个左右

# 基本语法
{{数据|过滤器:参数}} # 特殊:转义
# 后端
from django.utils.safestring import mark_safe
res = mark_safe('<h1>aaa</h1>')
# 此处的res传给前端的时候,由于考虑到安全性,需要我们写safe参数,但是我们已经在后端通过安全的方法创建,所以不用写
# 前端
{{res}} # <p>统计长度:{{ s|length }}</p>
# s ='abc' 结果:3 <p>默认值(第一个参数布尔值是True就展示第一个参数的值否在展示冒号后面的值):{{ b|default:'啥也不是' }}</p>
# b = None 结果:啥也不是 <p>文件大小:{{ file_size|filesizeformat }}</p>
# file_size = 1024 结果:1kb 默认以一个字节为单位,传数字 <p>日期格式化:{{ current_time|date:'Y-m-d H:i:s' }}</p>
# current_time = datetime.datetime.now()
# 结果:2020-05-28 17:25:47 和现在时间不同是settins时区不同 <p>切片操作(支持步长):{{ l|slice:'0:4:2' }}</p>
# l = [1,2,3,4,5,6,7] 结果:[1,3] 此处后面的传值和python切片传值相同 <p>切取字符(包含三个点):{{ info|truncatechars:9 }}</p>
# word = '阿斯达撒大所多撒大大大所' 结果:阿斯... <p>切取单词(不包含三个点 按照空格切):{{ egl|truncatewords:9 }}</p>
# egl='my name is jason my age is 18 and i am from China'
# 结果:my name is jason my age is 18 and ... <p>切取单词(不包含三个点 按照空格切):{{ info|truncatewords:9 }}</p>
# 如上 <p>移除特定的字符:{{ msg|cut:' ' }}</p> <p>拼接操作:{{ l|join:'$' }}</p> # 列表中的字符串拼接
<p>拼接操作(加法):{{ n|add:10 }}</p> # add前后数字的加减
<p>拼接操作(加法):{{ s|add:msg }}</p> # 字符串拼接 <p>转义:{{ hhh|safe }}</p>
<p>转义:{{ sss|safe }}</p>
<p>转义:{{ res }}</p>

3 标签

# for循环
{% for foo in l %}
<p>{{ forloop }}</p> # 每个元素的一些属性,比如first,last,是否是第一个元素,是否是最后一个元素等等
#{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 9, 'revcounter0': 8, 'first': True, 'last': False}
<p>{{ foo }}</p> # 一个个元素
{% endfor %} # if判断,和python没区别
{% if b %}
<p>baby</p>
{% elif s%}
<p>都来把</p>
{% else %}
<p>老baby</p>
{% endif %} # for与if混合使用
{% for foo in lll %}
{% if forloop.first %}
<p>这是我的第一次</p>
{% elif forloop.last %}
<p>这是最后一次啊</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% empty %}
<p>for循环的可迭代对象内部没有元素 根本没法循环</p>
{% endfor %} # 处理字典其他方法
{% for foo in d.keys %}
<p>{{ foo }}</p>
{% endfor %}
{% for foo in d.values %}
<p>{{ foo }}</p>
{% endfor %}
{% for foo in d.items %}
<p>{{ foo }}</p>
{% endfor %} # with起别名
{% with d.hobby.3.info as nb %}
<p>{{ nb }}</p>
在with语法内就可以通过as后面的别名快速的使用到前面非常复杂获取数据的方式
<p>{{ d.hobby.3.info }}</p>
{% endwith %}

4 自定义过滤器,标签,inclusion_tag

必须要做的三件事

  1. 在应用下创建一个名字”必须“叫templatetags文件夹
  2. 在该文件夹内创建“任意”名称的py文件 eg:mytag.py
  3. 在该py文件内"必须"先书写下面两句话(单词一个都不能错)
from django import template	

register = template.Library()

4.1 自定义过滤器

@register.filter(name='baby') # 注册一个过滤器,写上过滤器的名字
def my_sum(v1, v2): # 最多传两个值
return v1 + v2 # 展示在前端的是返回值
# 使用
{% load mytag %}
<p>{{ n|baby:666 }}</p>

4.2 自定义标签(可以传多个参数)

@register.simple_tag(name='plus') # 类似于自定义函数
def index(a,b,c,d):
return '%s-%s-%s-%s'%(a,b,c,d)
# 使用
# 标签多个参数彼此之间空格隔开
<p>{% plus 'jason' 123 123 123 %}</p>

4.3 自定义inclusion_tag

# 这里的html是我们要提前在这个页面上渲染好的html文件,相当与一个中转站
@register.inclusion_tag('left_menu.html')
def left(n):
data = ['第{}项'.format(i) for i in range(n)]
# 第一种
# return {'data':data} # 将data传递给left_menu.html
# 第二种
return locals() # 将data传递给left_menu.html
# 在我们想书写自定义标签的页面书写
{% left 5 %} # 总结:当某个页面布局被多个页面使用,且这个布局需要传参才能实现,我们可以用这个形式

5 模版的继承

存在有一些页面,它们的布局都一模一样,用户请求后,改变的只是一部分内容,这些页面就用到了模版的继承。

'''
首先要有一个主页,这个主页代码是完整的,我们为主页划分一下
导航栏,body左,body右,页脚
我们要求每次请求值修改body右的页面内容,就要在body右整体代码外加
{% block content %}
body右内容
{% endblock %}
此时这一块代码相当于被解封了,其他继承了主页的页面都可以修改这一块的内容变成自己的页面
''' '''
注册页面的布局和主页完全一样,就是要在body右修改成提交表单的形式
'''
# 先要继承
{% extends 'home.html' %}
# 继承之前要把这个页面代码清空,此时两个页面的内容是完全相同的
# 注册页面如果要把自己的代码替换到可修改的地方,就需要划分自己的代码 {% block content %}
注册页自己的内容,去替换被解封的主页区域,形成自己的页面
{% endblock %} # 通常我们的模版有三块可以被修改的地方,css代码,html代码,js代码 {% block css %} {% endblock %} {% block content %} {% endblock %} {% block js %} {% endblock %} # 每个子页面也可以有自己独有的css代码 html代码 js代码

6 模块的导入

# 在一个html页面把内容清空,只写需要被导入的代码

# 在其他需要用到这个页面的代码的地方导入即可

{% include 'wasai.html' %}

day63 django入门(4)的更多相关文章

  1. 【django入门教程】Django的安装和入门

    很多初学django的朋友,都不知道如何安装django开发以及django的入门,今天小编就给大家讲讲django入门教程. 注明:python版本为3.3.1.Django版本为1.5.1,操作系 ...

  2. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  3. python学习笔记--Django入门四 管理站点

    上一节  Django入门三 Django 与数据库的交互:数据建模 "管理员界面"是基础功能中的重要部分. django.contrib 包 Django自动管理工具是djang ...

  4. Django 入门

    Django 入门 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模型,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容 ...

  5. Django入门实践(三)

    Django入门实践(三) Django简单应用 前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道.下面举的例子 ...

  6. Django入门实践(二)

    Django入门实践(二) Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Djan ...

  7. Django入门实践(一)

    Django入门实践(一) Django编程思路+入门 认识Django有一个多月了,我觉得学习Django应该先理清它的编程思路.它是典型的MVC框架(在Django里也称MTV),我觉得Djang ...

  8. Django入门笔记

    Django入门笔记 **文档包含Django安装包.学习的笔记.代码等 安装 Django参考附件,只需要把附件拷贝到你需要的目录就行.Django是1.8.16版本 Python:在附件中,其中有 ...

  9. Django 入门案例开发(上)

    Django 入门案例开发(中) http://www.cnblogs.com/focusBI/p/7858267.html Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供 ...

随机推荐

  1. 网络编程-Netty-Reactor模型

    目录 # 摘要 高性能服务器 Reactor模式 Reactor单线程模型设计 Reactor多线程模型设计 主从Reactor多线程模型设计 Netty Reactor模型设计 参考 你的鼓励也是我 ...

  2. Spark Streaming + Kafka Integration Guide原文翻译及解析

    前面写了关于kafka和spark streaming的结合使用(https://www.cnblogs.com/qfxydtk/p/11662591.html),其具体使用用法其实来自于原文:htt ...

  3. Springboot搭建Eureka并设置Eureka登录账号密码

    Springboot搭建Eureka并设置Eureka登录账号密码 一.创建一个springboot项目 1.可以使用Spring Initializr,用浏览器打开http://start.spri ...

  4. c++ vector基本函数、排序、查找用法

    vector用法目录: 1.基本用法 2.vector的删除操作 3.vector的sort排序 4.翻转vector中的所有元素 5.find()函数的用法 6.vector实战(这里写的是我在最开 ...

  5. 将反向传播讲解的深入透彻的神一样的文章(numpy实现人工神经网络)

    为了完成机器学习课的项目,规定不许调tensorflow,pytorch这些包.可是要手工实现一个可训练的神经网络是非常困难的一件事,难点无他,就在于反向传播的实现.这不,我在网上发现了这篇文章.怎么 ...

  6. cb16a_c++_顺序容器的选用_排序_二分查找

    /*cb16a_c++_顺序容器的选用_排序_二分查找顺序容器: 1.vector的优点与缺点 vector优点:排序利用下标,快速排序,做二分查找非常快 2.list的优点与缺点 list优点:插入 ...

  7. jmeter在Windows下安装(含插件安装)

    [准备环境] jdk1.8 jmeter的安装包下载 [步骤] 1 把下载下来的压缩包解压,点击jmeter.bat 启动,启动后是英文界面 2 修改默认的英文界面,打开jmeter.properti ...

  8. 5种经典的Linux桌面系统

    最近一直在准备Linux相关的PPT,对于一个老码农来说Linux系统自然是比较熟悉了,随口可以说出好几种Linux的版本,然而对于计算机初学者可能就知道windows操作系统.也许你告诉他你可以安装 ...

  9. 基于领域驱动设计(DDD)超轻量级快速开发架构(二)动态linq查询的实现方式

    -之动态查询,查询逻辑封装复用 基于领域驱动设计(DDD)超轻量级快速开发架构详细介绍请看 https://www.cnblogs.com/neozhu/p/13174234.html 需求 配合Ea ...

  10. Page "页面路径" has not been registered yet.

    网上找了很多方法,但和我遇到的都不一样,我这个页面是我路由接口更改时遇到的错误,原因是我移动了文件,js里引用的文件找不到了 解决方法:更改引用路径即可