目录
模版层
一、模版语法传值
1.模版语法
(1)模版语法
- 与数据值变量相关
{{ }}
- 与逻辑相关
{% %}
-
模版语法的注释
在前端浏览器的检查中是不会看到的,只会在后端看到
{# #}
django的模版语法与jinja2不同,只支持句点符的方式
(2)针对需要加括号调用的名字,django模板语法会自动加括号调用,只需要写名字就行
-
例:
-
后端中定义了一个函数,
locals()
会将函数名传到页面上
def index_func(request):
def test1():
return 'test1的返回值'
return render(request, 'indexpage.html', locals())
-
模版语法
Django的模版语法会将自动其加括号调用
{{ test1 }}
2.传值特性
(1)方式一:通过字典的形式传值
精准传值,不浪费资源;但是针对数据量大的数据,传值麻烦
- 后端views.py
def index_func(request):
i = 666
d1 = {'name': 'jason', 'age': 19, 'hobby': ['read', {'a1': 'hahah'}]}
l1 = [11, 22, 33, 11]
return render(request, 'indexpage.html', {'i': i, 'd1': d1, 'l1': l1})
- index.html
{% if d1 %}
{{ l1 }}
{{ i }}
<p>今天是周三</p>
{% for foo in d1 %}
<p>{{ foo }}</p>
{% endfor %}
{% endif %}
(2)方式二:locals()
locals()
方法会将所有数据数据一起以同名字典的形式发送给html页面渲染好了之后发送给浏览器。
但是当有很多数据并不需要的时候,locals()
方法就显得浪费资源了
- 后端views.py
- index.html:同上
3.模版语法的传值特性
(1)python基本数据类型,对象名都可以传递(且可以点方法)
(2)文件对象也可以展示,并支持调用文件的方法如read write
(3)函数名传递过去的时候,也会自动加括号执行,但是不支持传参
(4)类名传过来会自动加括号调用,对象传过来还是对象
二、过滤器
1.过滤器语法
通过管道符|
来应用过滤器
{{ value|filter_name:参数 }}
2.过滤器的特点
(1)过滤器支持链式操作
(2)过滤器可以接受参数
(3)过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
(4)|
左右没有空格没有空格没有空格
3.常见过滤器
1.|add
# 数字
i = 666
{{ i|add:3 }}
# 字符串
s = 'hello world'
{{ s|add:'你好世界' }}
2.|length
返回值的长度,作用于字符串和列表。
# 字符串
{{ s|length }}
---
11
# 列表
{{ l1|length }}
--
4
3.|slice
切片
4.|date
格式化
{{ value|date:"Y-m-d H:i:s"}}
5.|safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
value = "<a href='#'>点我</a>"
{{ value|safe}}
6.|truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数
{{ value|truncatechars:9}}
7.|truncatewords
在一定数量的字后截断字符串。
{{ value|truncatewords:9}}
8.|filesizeformat
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB'
, '4.1 MB'
, '102 bytes'
, 等等)。
{{ value|filesizeformat }}
- 其他过滤器
三、模版层标签
1.if判断标签
会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断
- 语法
{% if d1 %}
内容块
...
{% endif %}
2.for循环标签
遍历每一个元素
(1)语法
{% for foo in d1 %}
<p>{{ foo }}</p>
{% endfor %}
(2)特点
- for循环的元素必须是可迭代对象
- 集合是无序的,每次循环的结果不同
(3)forloop
- 添加循环序号
在for循环标签内使用,产生forloop对象
{% for k in d1 %}
{{ forloop }}
{% endfor %}
- forloop对象内的属性
variable | description |
---|---|
forloop.counter |
当前循环的索引值(从1开始) |
forloop.counter0 |
当前循环的索引值(从0开始) |
forloop.revcounter |
当前循环的倒序索引值(从1开始) |
forloop.revcounter0 |
当前循环的倒序索引值(从0开始) |
forloop.first |
当前循环是不是第一次循环(布尔值) |
forloop.last |
当前循环是不是最后一次循环(布尔值) |
forloop.parentloop |
本层循环的外层循环 |
- forloop和if 判断
{% for k in d1 %}
{% if forloop.first %}
<p>这是第一个键{{ k }}</p>
{% elif forloop.last %}
<p>这是最后一个键{{ k }}</p>
{% else %}
<p>这是中间的键{{ k }}</p>
{% endif %}
{% endfor %}
(4)for ... empty
empty支持for循环,空字符串、空列表、空字典
{% empty %}
<p>这时候已经空了{{ k }}</p>
---
不会在浏览器页面展示
3.with标签:起别名
定义一个中间变量,多用于给一个复杂的变量起别名。
复杂数据获取之后需要反复使用,可以通过with起别名,但是这个别名,只支持在with语法中使用
{% with d1.hobby.1.a1 as h %}
{{ h }}
{% endwith %}
四、模版语法取值
django的模版语法取值只支持句点符
1.句点符的作用
从技术上讲,当模板系统遇到一个点,它会尝试下面的动作,顺序如下:
- 字典查询
- 属性或方法查找
- 数字索引查找
如果结果值是可调用的,则调用时不带参数。调用的结果成为模板值。
# 字典查询
{{ d1.name }}
# 属性或方法查找
<p>{{ d1.items }}</p>
<p>{{ d1.values }}</p>
# 数字索引查找
<p>{{ l1.1 }}</p>
2.句点符支持链式使用
既可以点索引也可以点键
{{ d1.hobby.1.a1 }}
五、自定义过滤器、标签和inclusion_tag(了解)
1.自定义模版语法的三步
想要自定义一些模版语法,需要先完成三个步骤
-
1.在应用目录下,创建一个名字必须交templatetags的目录
-
2.在上述目录下创建任意名称的py文件
-
3.在上述py文件内先编写两行固定的代码
from django import template
register = template.Library()
在这之后才支持自定义模版语法
2.自定义过滤器
过滤器只支持接收两个参数
使用方式:
-
后端
通过装饰符
@register.filter(name='自定义过滤器名')
@register.filter(name='myadd')
def func1(a, b):
return a + b
- 前端
# 导入自定义标签的文件
{% load mytags %}
<p>{{ i|myadd:1 }}</p>
3.自定义标签
像自定义函数,形参可以有多个,没有限制
自定义过滤器只能在{{}}中使用,自定义标签可以在{% %}中使用
使用方式:
-
后端
通过装饰符
@register.simple_tag(name='自定义标签名')
@register.simple_tag(name='simpletag')
def func2(a, b, c, d, e, f):
return f'{a}和{b}和{c}和{d}和{e}和{f}'
- 前端
# 导入自定义标签的文件
{% load yourtags %}
# 通过自定义的标签名来使用
{% simpletag "小明" "小明" "小明" "小明" "小明" "小明" %}
3.inclusion_tag
作用:用来生成局部的html代码,相当于小组件
主要用于产生无序列表
return locals()
将函数的所有东西传给html页面
通过html小页面渲染好传给 html页面
使用方法:
-
后端
@register.inclusion_tag('小组件html页面',name='组件名')
@register.inclusion_tag('menu.html',name='mymenu')
def func3(n):
html = []
for i in range(n):
html.append('<li>第%s页</li>'%i)
return locals()
- 小组件html页面
{% load mytags %}
{% mymenu 20 %}
五、模板的继承和导入
- 场景:通过页面上打开新的标签页,有很多地方和原页面一致,就可以使用模版的继承
1.模版的继承
模板继承:先构建一个基本的“骨架”模板base.html
,其中包含其他页面的的所有公共元素并在母版中定义子模板可以替换的块
这种方法最大限度地提高了代码重用率,并使将项目添加到共享内容区域变得容易,例如全节导航。
2.模板继承的步骤
(1)创建一个base.html
包含网站主要外观的模板
并在母版中使用{% block %}划定子版中可以修改的区域
{% block 区域名称%}
母版页面上标记的可修改的部分
{% endblock %}
(2)创建子页面section.html
继承母版,并导入子页面
{% extends 'home.html' %}
{% block 母版上的区域名称 %}
子页面中自定义部分
{% endblock %}
- block super
标签:框架,自定义,模版,Django,语法,html,标签,过滤器 From: https://www.cnblogs.com/DuoDuosg/p/16983355.html模版中至少有三个区域
- 页面内容区域
- css区域
- js区域
这样才可以使得子版有更多的拓展性