Django之模版层
模板语法之传值
Django提供的两种模板语法:
{{ 变量名}}:用于变量相关操作(引用){% 标签名 %}:用于逻辑相关操作(循环、判断)
传值的两种方式
指名道姓的传
return render(request, 'index.html', {'name':name})
打包传值
# locals() 将当前名称空间中所有的名字全部传递给`html`页面return render(request, 'index.html', locals())
传值的范围
- 函数名:模板语法会自动加括号执行,并将函数的返回值展示到页面上不支持传参(模板语法会自动忽略有参函数)
- 文件名:直接显示文件IO对象
- 类名:自动加括号实例化成对象
- 对象名:显示对象的地址,并且具有调用属性和方法的能力
传值使用
在Django模板语法中针对容器类型的取值只有一种方式句点符,既可以点key,也可以点索引 Django内部自动识别
模板语法之内置过滤器
过滤器是把视图传入的变量值加以修饰后再显示
语法
{{ 变量名|过滤器名:传给过滤器的参数 }} # 过滤器最多只能传输一个参数
常用内置过滤器
length
作用:统计数据的长度,对字符串、列表、字典等容器类型都起作用
{{ value|length }}
add
作用:算术加法或者字符串加法
{{ value|add:111 }}
{{ value|add:'aaa'}}
filesizeformat
作用:将数字转成合适的文件计量单位
{{ value|filesizeformat }}
default
作用:如果一个变量值是False或者为空,使用default后指定的默认值,否则,使用变量本身的值
{{ value|default:"nothing" }}
date
作用:将日期按照指定的格式输出
{{ value|date:'Y-m-d' }}
slice
作用:对输出的字符串进行切片操作,顾头不顾尾
{{ value|slice:'0:10' }}
truncatewords
作用:按照空格截取指定个数的文本(不包含三个点)
{{ value|truncatewords:3 }}
truncatechars
作用:按照字符个数截取文本(包含三个点)
{{ value|truncatechars:6 }}
cut
作用:移除指定的字符
{{ value|cut:'|' }}
safe
作用:出于安全考虑,Django的模板会对HTML标签、JS等语法标签进行自动转义,如果不想被转以使用safe
{{ value|safe }}
后端也可以写好直接传入前段
from django.util.safestring import make_safet = '<script>alert(123)</script>'res = make_safe(t)
更多过滤器
| 过滤器 | 说明 |
|---|---|
| add | 加法 |
| addslashes | 添加斜杠 |
| capfirst | 首字母大写 |
| center | 文本居中 |
| cut | 切除字符 |
| date | 日期格式化 |
| default | 设置默认值 |
| default_if_none | 为None设置默认值 |
| dictsort | 字典排序 |
| dictsortreversed | 字典反向排序 |
| divisibleby | 整除判断 |
| escape | 转义 |
| escapejs | 转义js代码 |
| filesizeformat | 文件尺寸人性化显示 |
| first | 第一个元素 |
| floatformat | 浮点数格式化 |
| force_escape | 强制立刻转义 |
| get_digit | 获取数字 |
| iriencode | 转换IRI |
| join | 字符列表链接 |
| json_script | 生成script标签,带json数据 |
| last | 最后一个 |
| length | 长度 |
| length_is | 长度等于 |
| linebreaks | 行转换 |
| linebreaksbr | 行转换 |
| linenumbers | 行号 |
| ljust | 左对齐 |
| lower | 小写 |
| make_list | 分割成字符列表 |
| phone2numeric | 电话号码 |
| pluralize | 复数形式 |
| pprint | 调试 |
| random | 随机获取 |
| rjust | 右对齐 |
| safe | 安全确认 |
| safeseq | 列表安全确认 |
| slice | 切片 |
| slugify | 转换成ASCII |
| stringformat | 字符串格式化 |
| striptags | 去除HTML中的标签 |
| time | 时间格式化 |
| timesince | 从何时开始 |
| timeuntil | 到何时多久 |
| title | 所有单词首字母大写 |
| truncatechars | 截断字符 |
| truncatechars_html | 截断字符 |
| truncatewords | 截断单词 |
| truncatewords_html | 截断单词 |
| unordered_list | 无序列表 |
| upper | 大写 |
| urlencode | 转义url |
| urlize | url转成可点击的链接 |
| urlizetrunc | urlize的截断方式 |
| wordcount | 单词计数 |
| wordwrap | 单词包裹 |
| yesno | 将True,False和None,映射成字符串‘yes’,‘no’,‘maybe’ |
为模版过滤器提供参数的方式是:过滤器后加个冒号,再紧跟参数,中间不能有空格!
模板语法之标签
if标签
对一个变量求值,如果它的值True这个内容块就会输出:
{% if 条件1 %}<p>条件1成立,打印此消息</p>{% elif 条件2 %}<p>条件2成立,打印此消息</p>{% else %}<p>条件1、2都不成立,打印此消息</p>{% endif %}
补充:if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断
for标签
循环对象中的每一个元素
{% for i in l1 %}<p>{{ i }}</p>{% endfor %}
遍历一个字典
{% for k,v in dic.item %}<p>{{ k }}:{{ v }}</p>{% endfor %}
循环序号可以通过{{ forloop }}显示
| 变量名 | 描述 |
|---|---|
forloop.counter |
循环计数器,表示当前循环的索引(从 1 开始)。 |
forloop.counter0 |
循环计数器,表示当前循环的索引(从 0 开始)。 |
forloop.revcounter |
反向循环计数器(以最后一次循环为 1,反向计数)。 |
forloop.revcounter0 |
反向循环计数器(以最后一次循环为 0,反向计数)。 |
forloop.first |
当前循环为首个循环时,该变量为 True |
forloop.last |
当前循环为最后一个循环时,该变量为 True |
forloop.parentloop |
在嵌套循环中,指向当前循环的上级循环 |
当传递到 for 标签中的数组不存在或为空时,可以使用 {% empty %} 标签来指定输出的内容
{% for i in l1 %}{% if forloop.first %}<p>这是第一次循环</p>{% elif forloop.last %}<p>这是最后一次循环</p>{% else %}<p>中间循环</p>{% endif %}{% empty %}<p>for循环对象为空 自动执行</p>{% endfor %}
更多标签
| 标签 | 说明 |
|---|---|
| autoescape | 自动转义开关 |
| block | 块引用 |
| comment | 注释 |
| csrf_token | CSRF令牌 |
| cycle | 循环对象的值 |
| debug | 调试模式 |
| extends | 继承模版 |
| filter | 过滤功能 |
| firstof | 输出第一个不为False的参数 |
| for | 循环对象 |
| for … empty | 带empty说明的循环 |
| if | 条件判断 |
| ifchanged | 如果有变化,则.. |
| include | 导入子模版的内容 |
| load | 加载标签和过滤器 |
| lorem | 生成无用的废话 |
| now | 当前时间 |
| regroup | 根据对象重组集合 |
| resetcycle | 重置循环 |
| spaceless | 去除空白 |
| templatetag | 转义模版标签符号 |
| url | 获取url字符串 |
| verbatim | 禁用模版引擎 |
| widthratio | 宽度比例 |
| with | 上下文变量管理器 |
使用文档:https://docs.djangoproject.com/zh-hans/4.0/ref/templates/builtins/
自定义过滤器与标签
- 在应用下需要创建一个名为
templatetags的文件夹 templatetags文件夹任意新建一个py文件,在该文件中自定义过滤器或标签- 在该
py文件内需要先提前编写两行固定的代码
from django import templateregister = template.Library()
自定义过滤器
# 自定义过滤器:最多只能接收两个参数@register.filter(is_safe=True)def index(a, b): // 参数传递为a=value,b=666return a + b
{{% load my_tags %}} // 必须先加载自定义过滤器和标签的文件,一个html页面加载一次就可以了{{ value|index:666 }}
自定义标签
# 自定义标签:可以接收任意的参数@register.simple_tagdef func(a, b, c, d):return a + b + c + d
{% func 1 2 3 4 %} // 参数之间空格隔开即可
可以指定name
@register.simple_tag(name='my_tag')def func(a, b, c, d):return a + b + c + d
{% my_tag 1 2 3 4 %}
自定义inclusion_tag
该方法需要先作用于一个局部html页面,之后将渲染的结果放到调用的位置
# 自定义inclusion_tag@register.inclusion_tag('left.html')def func2(n):l1 = []for i in range(1, 1 + n):l1.append(f'第{i}页')return locals()
// left.html<ul>{% for i in l1 %}<li>{{ i }}</li>{% endfor %}</ul>
{% func2 10 %}
模板的导入
在一个模板文件中,“引入”另外一个模板文件的内容
语法
{% include '模版名称' %}
使用
menu.html
<p>这是一个菜单</p>
index.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><div class="h2">{% include 'menu.html' %}{% include 'menu.html' %}{% include 'menu.html' %}{% include 'menu.html' %}</div></body></html>
模板的继承
继承父模版页面,可以在子模版使用该页面上面所有的资源
语法
父模版
{% block 名称 %}...{% endblock %}
子模版
{% extends "模版名称" %}
使用
父模版
先在模板中通过block定义那些区域内容可以被修改
<h4>个人信息</h4><p>姓名:{% block name %}(请自定义){% endblock %}</p><p>年龄:{% block age %}(请自定义){% endblock %}</p>
子模版
子模板继承父模板,并修改划定的区域
<html><body>{% extends "menu.html" %}{% block name %}kevin{% endblock %}{% block age %}22{% endblock %}</body></html>

block 标签的部分已经被自定义的内容替换掉了,如果没有修改规定区域,将会继续使用父模板中的内容。如果想要在父模板 block中新增内容而不是完全覆盖,可以使用{{ block.super }}
<html><body>{% extends "menu.html" %}{% block name %}kevin{% endblock %}{% block age %}22{{ block.super }} (新增的内容){% endblock %}</body></html>
