模板语法
CBV源码剖析
#FBV和CBV
'''
他们两个都是出现在视图函数views中的,视图函数没必要必须是函数,也可以是一个类,当我们定义一个类的时候就是CBV了,CBV下是通过在类内部定义请求方式的同名函数来进行不同的操作的。
通过对源码的查看,可以看出其实本质上CBV也是FBV。当请求来的时候会去判断请求的方式,利用反射去执行定义的相应函数。
'''
# CBV的使用方式:
from django.views import View # 首先需要导入对应的模块
url(r'^index/', views.MyCBV.as_view()) # as_view()是一个闭包函数
'''
在django启动的时候,带括号就会自动触发执行,as_view()返回其本身内部定义的一个view函数的内存地址,当匹配到路由的时候,就会执行该函数,函数内部的本质就是判断请求的方式,然后反射到类创建的对象来执行。
'''
看源码谨记:
- 先从对象自己找,再从产生对象的类中找,之后再去父类中找。
- 看源码看到了self,要知道该self传的是什么东东。
模板语法传值
整理出的规则:
- {{ }}:在前端中一般使用是变量相关
- {% %}:逻辑相关
基本上所有的数据类型都可以传前端,在前端都可以直接使用{{}}来进行使用,容器类型都只能使用点的方式进行 ,同时还可以使用点索引的方式,两者还可以混用。
传递函数名会自动加括号调用,不过不支持函数传参数。传类名的时候也会自动加括号调用进行实例化。
过滤器
过滤器就类似于是模板语法内置的内置语法,最多只能有两个参数。
# 基本语法
{{ 数据|过滤器:参数}}
# 在写前端项目的时候,部分前端代码可以经由后段代码传到前端并进行解析。
|safe # 告诉前端这是安全的,然后会解析
# 在后端向前端传需要导入模块
from gjango.utils.safestring import mark_safe
res = mark_safe('前端代码字符串')
统计长度:{{ s|length }}
默认值:{{ s|default:'前面的false才会显示我' }}
文件大小:{{ f|filesizeformat }}
日期格式化:{{ time|date:'Y-m-d' }}
切片操作(支持步长):{{ l|slice:'0:5:2' }}
切取字符:{{ info|truncatechars:9 }}
切取单词(按照空格进行切):{{ msg|truncatewords:9 }}
移除特定的字符:{{ msg|cut:'A' }}
拼接操作(可进行数字或者字符串):{{ n|add:10 }}
转义:{{ hhh|safe }}
转义:{{ res }}
标签
# for 循环
{% for foo in l %}
<p>{{ forloop }}</p>
{% empty %}
l是空的时候执行的标签
{% endfor %}
# if判断
{% if a %}
标签体
{% elif s %}
标签体
{% else s %}
标签体
{% endif %}
# with起别名
{% with xxx as ooo %}
在这个内部就可以通过别名快速获取前面的xxx
{% endwith %}
自定义过滤器、标签和inclusion_tag
'''
首先进行三步:
1. 在应用下创建一个名字叫templatetags文件夹
2. 在该文件夹新爱创建任意名称的py文件
3. 在py文件中必须书写下面两句话:
from django import template
register = template.Library()
接下来就可以进行自定义了
'''
@register.filter(name='过滤器名字')
def my_tag(a):
return XXX
{% load py文件 %}
{{ s|过滤器名字}}
# 自定义标签(参数可以有多个) 相当于函数
@register.simple_tag(name='标签名')
def index(a,b):
return '1,2,3'
使用{% 标签名 参数 %} # 多个参数之间使用空格
# 自定义 inclusion_tag
'''
在html页面的某一个地方的页面需要传参数才能渲染出来,并且在多个页面都要使用,那么就可以考虑将该局部页面做成inclusion_tag形式
其原理就是先定义一个方法,在页面上调用该方法并传值,该方法会传一些数据给html页面,然后将渲染好的结果放到调用的位置
'''
@register.inclusion_tag('html页面')
def left(n):
data = XXX
return locals() # 推荐是想用这一种
return {'data':data}
{% left 5 %} # 使用
模板的继承
当某些页面只需要局部进行更改而整体不会进行改变的时候,就可以使用模板的继承
步骤如下:
-
创建一个html文件,将之全部内容删除。
-
{% extends '继承的页面模板' %}
-
{% block content %}
模板内容
{% endblock%}
在模板页面找到需要进行修改的内容
-
在子页面对区域进行更改
{% block content %}
子页面内容
{% endblock%}
一般情况新爱模板页面应该至少有三块被修改的区域
- css区域
- html区域
- js区域
{% block css %}
{% endblock %}
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}
模块的导入
加入某一个局部使用较多的话 可以当做模块进行导入
{% incluse '模块文件' %}