一、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. vue axios封装

    前言: 对第三方库进行二次封装和抽离到统一模块,项目面对自己的模块进行开发.如果有一天更换库,只需要修改自己模块中的代码,无需对整个项目进行重构. 将axios网络请求库封装到network文件下的r ...

  2. 红楼梦 + 写入 MySQL

    import requests import re import pymysql from bs4 import BeautifulSoup conn = pymysql.Connect(host=' ...

  3. Telegraf和Grafana监控多平台上的SQL Server-自定义监控数据收集

    问题 在上一篇文章中,我们使用Telegraf自带的Plugin配置好了的监控,但是自带的Plugin并不能完全覆盖我们想要的监控指标,就需要收集额外的自定义的监控数据,实现的方法有: 开发自己的Te ...

  4. Laravel中Homestead添加多站点时遇到问题

    Homestead做Laravel的开发还是很方便的,但是在添加多站点的时候,发现几个坑,来做个记录. 首先,官方文档给了修改homestead.yaml文件的方式,只需要在sites字节下添加一个新 ...

  5. win10 设置开机启动VMware虚拟机并打开指定镜像

    1.设置win10开机启动应用 把应用程序的‘快捷方式’放到“系统启动文件夹”里即可. 2.开机启动VMware虚拟机并打开指定镜像 a.右键VMware Workstation快捷方式,看属性 b. ...

  6. 十几万条数据的表中,基于帝国cms 。自己亲身体验三种批量更新数据的方法,每一种的速度是什么样的

    需求是 上传Excel 读取里面的数据.根据Excel中某一个字段,与数据表中的一个字段的唯一性.然后把 Excel表中数据和数据库表中数据一次更改.本次测试一次更新31条数据. 本次测试基于帝国cm ...

  7. phoenix从入门到精通

      第一章.phoenix入门简介 1. Phoenix定义 Phoenix最早是saleforce的一个开源项目,后来成为Apache基金的顶级项目. Phoenix是构建在HBase上的一个SQL ...

  8. (十)自动化测试pom完整文件

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  9. Java8新特性之函数式接口

    <Java 8 实战>学习笔记系列 定义 函数式接口只定义一个抽象方法,可以有多个默认方法 函数式接口的接口名上,会被@FunctionalInterface标注 作用 函数式接口的方法可 ...

  10. 【Flutter实战】图片组件及四大案例

    老孟导读:大家好,这是[Flutter实战]系列文章的第三篇,这一篇讲解图片组件,Image有很多高级用法,希望对您有所帮助. 图片组件是Flutter基础组件之一,和文本组件一样必不可少.图片组件包 ...