模板语言详解
模板中也有自己的语言,该语言可以实现数据展示
- 变量和循环
{{ item }}
{% for item in item_list %}
<a>{{ item }}</a>
{{ forloop.counter }}
{{ forloop.first }}
{{ forloop.last }}
{% endfor %}
<!--
forloop 变量只能在循环中得到,当模板解析器到达{% endfor %}时, forloop 就会消失
-->
- 判断
{% if obj %} {% else %} {% endif %}
<!--
{% if %} 标签接受and,or或者not来测试多个变量值或者否定一个给定的变量
{% if %} 标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义,例如下面的标签是不合法的:
{% if obj1 and obj2 or obj3 %}
-->
- 继承
<!--母板:base.html 文件-->
{% block title %}{% endblock %}
<!-- 子板继承 -->
{% extends "base.html" %}
{% block title %}
<div>
新内容,原来包含在母版的盒子内的内容将被覆盖
</div>
{% endblock %}
<!-- 子板继承时,在原来母版内容基础上再添加新的内容 -->
{% block title %}
{{ block.super }} <!--继续展示上级代码块的内容-->
<div>原来内容还在,并添加新的内容</div>
{% endblock %}
<!--
需要注意的点:
1. 如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。
2. 基础模板中的 {% block %} 标签越多越好,子模板不必定义父模板中的每个 {% block %}。
3. {% block %} 的名字在同一个模板中不允许重复
-->
-
csrf_token
{% csrf_token %}
用于生成csrf_token的标签,用于防治跨站攻击验证。 其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的。
- 加载引入 html 文件片段
{% load "other.html"%}
-
其他方法:
<!-- 时间日期格式化 --> {{ date_value|date:"Y-m-d H:i:s"}} <!-- 信任外部标签 --> <!-- tpl_ul = <ul><li>我是后台视图传过来的标签</li></ul> --> {{ tpl_ul |safe }} <!-- v_list = [] --> {{ v_list|default:'空的' }}<br>
内置的过滤器
date
{{ staff.date|date:'Y-m-d'}}
// 2018-12-17
truncatewords
<!-- 只显示 content 变量的前30个词 -->
{{ item.content |truncatewords:30 }}
default
<!--如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值-->
{{ value|default:"nothing" }}
default_if_none
<!--假如 value 的值是 None 这显示出指的的值-->
{{ value|default_if_none:"" }}
ength
<!--返回值的长度。它对字符串和列表都起作用-->
{{ value|length }}
filesizeformat
将该数值格式化为一个 “人类可读的” 文件容量大小 (例如 '13 KB'
, '4.1 MB'
, '102 bytes'
, 等等)
{{ value|filesizeformat }}
add
把add后的参数加给value
{{ value|add:"2" }} <!--如果 value 为 4,则会输出 6.-->
capfirst
将变量首字母变大写
{{ value|capfirst }} <!--如果value是test过滤后转为Test-->
cut
移除value中所有的与给出的变量相同的字符串
{{ value|cut:" " }}
dictsort
根据指定的key值对列表字典排序,并返回
{{ value|dictsort:"name" }}
如,给定的值是:
[
{'name': 'peter', 'age': 19},
{'name': 'amy', 'age': 22},
{'name': 'jim', 'age': 31},
]
那么结果将是;
[
{'name': 'amy', 'age': 22},
{'name': 'jim', 'age': 31},
{'name': 'peter', 'age': 19},
]
也可以处理较为复杂的;
{% for book in books|dictsort:"author.age" %}
* {{ book.title }} ({{ book.author.name }})
{% endfor %}
如给定值为:
[
{'title': '1984', 'author': {'name': 'George', 'age': 45}},
{'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}},
{'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}},
]
那么结果为:
* Alice (Lewis)
* 1984 (George)
* Timequake (Kurt)
random
随机返回一个值
{{ value|random }}
如果 value
是 列表 ['a', 'b', 'c', 'd']
, 可能输出的是 "b"
slice
**切片 ** 可对列表或字符串切片
{{ some_list|slice:":2" }}
如果 some_list
是 ['a', 'b', 'c']
, 输出结果为 ['a', 'b']
divisibleby
用于判断整除
<!--是否被 5 整除-->
{{ nmu|divisibleby: 5 }}