一、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. [C#.NET 拾遗补漏]05:操作符的几个骚操作

    阅读本文大概需要 1.5 分钟. 大家好,这是极客精神[C#.NET 拾遗补漏]专辑的第 5 篇文章,今天要讲的内容是操作符. 操作符的英文是 Operator,在数值计算中习惯性的被叫作运算符,所以 ...

  2. JavaScript常用项目(更新至19.11.17)

    目录 项目一:鼠标拖动方块 项目二:网页显示键入字母 项目三:实现滚播图 项目四:   本地数据记事本 项目一:鼠标拖动方块 代码: <!DOCTYPE html> <html> ...

  3. Charles抓包1-Charles安装汉化(附正版注册码)

    目录 1.下载&&安装 2.汉化 1.下载&&安装 charles官网 charles下载 下载后直接安装即可. 2.汉化 下载提供的汉化包charles.jar(加群 ...

  4. iOS开发实践-OOM治理

    概览 说起iOS的OOM问题大家第一想到的应该更多的是内存泄漏(Memory Leak),因为无论是从早期的MRC还是2011年Apple推出的ARC内存泄漏问题一直是iOS开发者比较重视的问题,比如 ...

  5. 一文梳理JS事件

    JavaScript与HTML的交互是通过事件进行的.事件,就是文档或浏览器窗口发生的一些特定的交互瞬间. 事件流 事件捕获 事件冒泡 事件处理程序 事件委托 1. 事件流 如果单机页面上的某个按钮, ...

  6. 多语言工作者の十日冲刺<10/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--第十天(05.09) 作业正文 ...

  7. Java基本数据类型和包装类

    一:八大基本类型 二:基本数据类型及包装类 三:基本类型和包装类的区别 1:定义不同.封装类是对象:基本类型不是. 2:使用方式不同.包装类需要先new初始化,再通过JVM根据具体情况实例化后赋值:基 ...

  8. unknown directive "" in E:\canteen\nginx-1.16.0/conf/nginx.conf:3-------文本编辑器修改nginx配置文件的坑

    nignx小白一个,今天在配置nginx的时候,理所当然的用了文本编辑器编辑并保存了一下nginx的nginx.conf配置文件,一不小心就折腾了几个钟. 保存之后就nginx -s reload一下 ...

  9. Office2019 相关激活秘钥

    零售版 W8W6K-3N7KK-PXB9H-8TD8W-BWTH9 批量板 N9J9Q-Q7MMP-XDDM6-63KKP-76FPM

  10. Python 偏函数用法全方位解析

    Python的functools模块中有一种函数叫“偏函数”,自从接触它以来,发现确实是一个很有用且简单的函数,相信你看完这篇文章,你也有相见恨晚的感觉. 我们都知道,函数入参可以设置默认值来简化函数 ...