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_safe
t = '<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 template
register = template.Library()
自定义过滤器
# 自定义过滤器:最多只能接收两个参数
@register.filter(is_safe=True)
def index(a, b): // 参数传递为a=value,b=666
return a + b
{{% load my_tags %}} // 必须先加载自定义过滤器和标签的文件,一个html页面加载一次就可以了
{{ value|index:666 }}
自定义标签
# 自定义标签:可以接收任意的参数
@register.simple_tag
def 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>