控制自动转义是否可用. 这种标签带有任何 on
或 off
做为参数的话,他将决定转义块内效果。 该标签会以一个endautoescape
做为结束标签.html
当自动转义生效时,全部变量内容会被转义成HTML输出(在全部过滤器生效后) 这等同与手动将escape
筛选器应用于每一个变量。python
实例:数据库
1)django
<!-- index.html文件 -->
<body>
<p>{{ text }}</p>
{% autoescape off %}
{{ text }}
{% endautoescape %}
</body>
若是: text = "<b>文本内容</b>"浏览器
页面显示结果:缓存
<b>文本内容</b>服务器
文本内容app
2)less
<!-- index.html文件 -->
<body>
<p>{{ text }}</p>
{% autoescape off %}
{{ text|escape }}
{% endautoescape %}
</body>
页面显示结果:ide
<b>文本内容</b>
<b>文本内容</b>
使用了escape过滤器, 则对text文本转义
(1) safe 通常做用于单行文本
(2) autoescape off 通常做用于块级内容
实例:
1)
<body>
<p>{{ text }}</p>
{% autoescape on %}
{{ text }}
{% endautoescape %}
</body>
页面显示结果:
<b>文本内容</b>
<b>文本内容</b>
2)
<body>
<p>{{ text|safe }}</p>
{% autoescape off %}
{{ text }}
{{ text|escape }}
{% endautoescape %}
</body>
页面显示结果:
文本内容
文本内容
通常在父模板可使用block标签, 把变化的内容能够包裹在block标签内; 子模板引用父模板后, 可使用block标签重写内容, 覆盖父模板中原来的内容.
实例:
<!-- 父模板html -->
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>年度页面</title>
</head>
<body>
<div>
<p>这是年度新闻</p>
</div>
{% block content %}
<p>页面主体内容</p>
{% endblock content %}
</body>
</html>
<!-- 子模板一 html -->
{% extends 'show_year.html' %}
<!-- 子模板二 html -->
{% extends 'show_year.html' %}
{% block content %}
<p>子模板中内容</p>
{% endblock %}
子模板的显示结果:
子模板一:
这是年度新闻
页面主题内容
子模板二:
这是年度新闻
子模板中内容
在 {% comment %}
和 {% endcomment %}
,之间的内容会被忽略,做为注释。至关于多行注释
示例:
{% comment %}
<b>粗体</b>
<div>
<p>这是Index页面</p>
</div>
{% endcomment %}
这部分注释的内容, 在服务器端就直接忽略到了, 不会发送给客户端.
这个标签用于跨站请求伪造保护.
客户端在提交表单到服务端时, 若是表单中不写这个标签, 服务端会直接返回403 Forbidden
的错误. 把这个标签写到表单中, 能够避免发生这个错误.
当把csrf_token写到表单中后, 其实客户端在提交数据时, 会提交一个name=csrfmiddlewaretoken
, value
为随机的64位字符给服务端, 服务端收到后, 会根据这串字符校验客户端的合法性.(若是想看这个csrfmiddlewaretoken的具体内容,能够打开浏览器的调试控制台; 你会看到一个属性type='hidden'的input标签, value
已经有默认值).
表单
<form action="" method="POST">
{% csrf_token %}
<input type="text" name="name" placeholder="姓名">
<button type="submit">提交</button>
</form>
每当这个标签被访问,则传出一个它的可迭代参数的元素。 第一次访问返回第一个元素,第二次访问返回第二个参数,以此类推. 一旦全部的变量都被访问过了,就会回到最开始的地方,重复下去
实例:
1) 这个标签在循环中特别有用:
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
第一次迭代产生的HTML引用了
row1
类,第二次则是row2
类,第三次 又是row1
类,如此类推。2) 你也可使用变量, 例如,若是你有两个模版变量,
rowvalue1
和rowvalue2
, 你可让他们的值像这样替换:{% for o in some_list %}
<tr class="{% cycle rowvalue1 rowvalue2 %}">
...
</tr>
{% endfor %}
被包含在cycle中的变量将会被转义。 你能够禁止自动转义:
{% for o in some_list %}
<tr class="{% autoescape off %}{% cycle rowvalue1 rowvalue2 %}{% endautoescape %}">
...
</tr>
{% endfor %}
你能混合使用变量和字符串:
{% for o in some_list %}
<tr class="{% cycle 'row1' rowvalue2 'row3' %}">
...
</tr>
{% endfor %}
输出整个调试信息,包括当前上下文和导入的模块。
表示当前模板继承自一个父模板
这个标签能够有两种用法:
{% extends "base.html" %}
(要有引号).继承名为"base.html"
的父模板{% extends 变量 %}
使用variable
若是变量被计算成一个字符串,Django将会把它当作是父模版的名字。 若是变量被计算到一个Template
对象,Django将会使用那个对象做为一个父模版。一般模板名称是相对于模板加载器的根目录。 字符串参数也能够是以./
或../
开头的相对路径。 例如,假设如下目录结构:
dir1/
template.html
base2.html
my/
base3.html
base1.html
在template.html
中,如下路径将有效:
{% extends "./base2.html" %}
{% extends "../base1.html" %}
{% extends "./my/base3.html" %}
经过一个或多个过滤器对内容过滤。 做为灵活可变的语法,多个过滤器被管道符号相链接,且过滤器能够有参数。
注意块中全部的内容都应该包括在endfilter
和filter
标签中。
注: escape
和safe
过滤器不是可接受的参数。 而应使用autoescape
标记来管理模板代码块的自动转义。
实例:
{% filter force_escape|lower %}
This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}
{% autoescape off %}
{% filter force_escape|lower %}
This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}
{% endautoescape %}
输出第一个不为False
参数。 若是传入的全部变量都为False
,就什么也不输出。
例如:
{% firstof var1 var2 var3 %}
它等价于:
{% if var1 %}
{{ var1 }}
{% elif var2 %}
{{ var2 }}
{% elif var3 %}
{{ var3 }}
{% endif %}
固然你也能够用一个默认字符串做为输出以防传入的全部变量都是False:
{% firstof var1 var2 var3 "default value" %}
循环组中的每个项目,并让这些项目在上下文可用。 举个例子,展现athlete_list
中的每一个成员:
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
能够利用{% for obj in list reversed %}
反向完成循环。
若是你须要循环一个包含列表的列表,能够经过拆分每个二级列表为一个独立变量来达到目的。 举个例子,若是你的内容包括一个叫作points
的(x,y) 列表,你能够像如下例子同样输出points列表:
{% for x, y in points %}
There is a point at {{ x }},{{ y }}
{% endfor %}
若是你想访问一个字典中的项目,这个方法一样有用。 举个例子:若是你的内容包含一个叫作data
的字典,下面的方式能够输出这个字典的键和值:
{% for key, value in data.items %}
{{ key }}: {{ value }}
{% endfor %}
请记住,对于点运算符,字典键查找优先于方法查找。若是要在模板中使用这些方法(items
,values
,keys
等),请避免添加名为字典方法的键。
for循环可用的参数:
变量 | 描述 |
---|---|
forloop.counter |
当前循环的索引值(索引从1开始) |
forloop.counter0 |
当前循环的索引值(索引从0开始) |
forloop.revcounter |
当前循环的倒序索引值(索引从1开始) |
forloop.revcounter0 |
当前循环的倒序索引值(索引从0开始) |
forloop.first |
若是这是第一次循环,返回True |
forloop.last |
若是这是最后一次循环,则为True |
forloop.parentloop |
对于嵌套循环,这是当前循环的外层循环 |
for
标签带有一个可选的{% empty %}
从句,以便在给出的组是空的或者没有被找到时,能够有所操做。
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% empty %}
<li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>
它和下面的例子做用相等,可是更简洁、更清晰甚至可能运行起来更快:
<ul>
{% if athlete_list %}
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
{% else %}
<li>Sorry, no athletes in this list.</li>
{% endif %}
</ul>
{% if %}
会对一个变量求值,若是它的值是“True”(存在、不为空、且不是boolean类型的false值),这个内容块会输出:
{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
Athletes should be out of the locker room soon!
{% else %}
No athletes.
{% endif %}
上述例子中,若是athlete_list
不为空,就会经过使用{{ athlete_list|length }}
过滤器展现出athletes的数量。
正如你所见,if
标签以后能够带有一个或者多个{% elif %}
从句,也能够带有一个{% else %}
从句以便在以前的全部条件不成立的状况下完成执行。 这些从句都是可选的。
if
标签可使用not
,and
或or
来测试多个变量的布尔值.
加载模板并以标签内的参数渲染。 这是一种能够引入别的模板的方法。
模板名能够是变量或者是硬编码的字符串,能够用单引号也能够是双引号.
下面这个示例包括模板"foo/bar.html"
的内容:
{% include "foo/bar.html" %}
一般模板名称是相对于模板加载器的根目录。 字符串参数也能够是以./
或../
开头的相对路径,如extends
标签中所述。
加载自定义模板标签集。
举个例子, 下面这模板将会从package
包中载入全部otherlibrary
和somelibrary
中已经注册的标签和过滤器:
{% load somelibrary package.otherlibrary %}
你还可使用from
参数从库中选择性加载单个过滤器或标记。 在下面这个示例中,名为somelibrary
和bar
的模板标签/过滤器将从foo
加载:
{% load foo bar from somelibrary %}
显示最近的日期或事件,能够经过给定的字符串格式显示。
实例:
{% now 'Y-m-d H:i:s' %}
输出相似:
2018-10-11 07:05:40
您也可使用语法{% now “Y” as current_year %}
将输出(做为字符串)存储在变量中。 This is useful if you want to use {% now %}
inside a template tag like blocktrans
for example:
{% now "Y" as current_year %}
{% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}
<!-- 使用blocktrans标签须要在html文件头部加上 {% load i18n %}, 导入已有的i18n模板-->
用类似对象间共有的属性重组列表.
This complex tag is best illustrated by way of an example: say that cities
is a list of cities represented by dictionaries containing "name"
,"population"
, and "country"
keys:
cities = [
{'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
{'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
{'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
{'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
{'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]
...而且您想显示按国家/地区排序的分层列表,以下所示:
印度
美国
日本
你可使用{% regroup %}
标签来给每一个国家的城市分组。 如下模板代码片断将实现这一点:
{% regroup cities by country as country_list %}
<ul>
{% for country in country_list %}
<li>{{ country.grouper }}
<ul>
{% for city in country.list %}
<li>{{ city.name }}: {{ city.population }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
让咱们来看看这个例子。 {% regroup %}
有三个参数: 你想要重组的列表, 被分组的属性, 还有结果列表的名字. 在这里,咱们经过country_list
属性从新分组country
列表,并调用结果cities
。
{% regroup %}
产生一个清单(在本例中为country_list
的组对象。 组对象是具备两个字段的namedtuple()
的实例:
grouper
- 按分组的项目(例如,字符串“India”或“Japan”)。list
- 此群组中全部项目的列表(例如,全部城市的列表,其中country ='India')。在Django更改1.11:
组对象已从字典更改成namedtuple()
。
Because {% regroup %}
produces namedtuple()
objects, you can also write the previous example as:
{% regroup cities by country as country_list %}
<ul>
{% for country, local_cities in country_list %}
<li>{{ country }}
<ul>
{% for city in local_cities %}
<li>{{ city.name }}: {{ city.population }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
请注意,{% regroup %}
不会对其输入进行排序! 咱们的例子依赖于事实:cities
列表首先由country
排序。 若是country
列表不经过cities
对其成员进行排序,则从新分组将天真显示单个国家/地区的多个组。 例如,假设cities
列表已设置为此(请注意,国家/地区未分组在一块儿):
cities = [
{'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
{'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
{'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
{'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
{'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]
对于cities
的输入,示例{% regroup %}
以上将致使如下输出:
印度
美国
印度
美国
日本
另外一个解决方案是使用dictsort
过滤器对模板中的数据进行排序,若是您的数据在字典列表中:
{% regroup cities|dictsort:"country" by country as country_list %}
重置先前的循环,以便在下一次遇到时从其第一个项目从新启动。 没有参数, {% resetcycle %}
会重置模板中定义的最后一个{% cycle %}
用法示例:
{% for coach in coach_list %}
<h1>{{ coach.name }}</h1>
{% for athlete in coach.athlete_set.all %}
<p class="{% cycle 'odd' 'even' %}">{{ athlete.name }}</p>
{% endfor %}
{% resetcycle %}
{% endfor %}
这个示例将返回下面的HTML:
<h1>José Mourinho</h1>
<p class="odd">Thibaut Courtois</p>
<p class="even">John Terry</p>
<p class="odd">Eden Hazard</p>
<h1>Carlo Ancelotti</h1>
<p class="odd">Manuel Neuer</p>
<p class="even">Thomas Müller</p>
注意第一个块以class="odd"
结束,新的以class="odd"
开头。 没有{% resetcycle %}
标签,第二个块将以class="even"
删除HTML标签之间的空白格. 包括制表符和换行.
用法示例:
{% spaceless %}
<p>
<a href="foo/">Foo</a>
</p>
{% endspaceless %}
这个示例将返回下面的HTML:
<p><a href="foo/">Foo</a></p>
注: 仅删除 tags 之间的空格 – 而不是标签和文本之间的。
返回与给定视图和可选参数匹配的绝对路径引用(不带域名的URL)。 在解析后返回的结果路径字符串中,每一个特殊字符将使用iri_to_uri()
编码。
这是一种不违反DRY原则的输出连接的方式,它能够避免在模板中硬编码连接路径。
{% url 'some-url-name' v1 v2 %}
第一个参数是url()
name
。 它能够是一个被引号引发来的字符串或者其余的上下文变量. 其余参数是可选的而且应该以空格隔开,这些值会在URL中以参数的形式传递. 上面的例子展现了如何传递位置参数. 固然你也可使用关键字参数.
{% url 'some-url-name' arg1=v1 arg2=v2 %}
不要把位置参数和关键字参数混在一块儿使用。 URLconf所需的全部参数都应该存在。
例如,假设您有一个视图app_views.py
,其URLconf接受客户端ID(此处client()
是视图文件app_views.client
)。 URLconf行可能以下所示:
('^client/([0-9]+)/$', app_views.client, name='app-views-client')
若是你的应用中的URLconf 已经被包含到项目 URLconf 中,好比下面这样
('^clients/', include('project_name.app_name.urls'))
而后,在模板中,您能够建立一个此视图的连接,以下所示:
{% url 'app-views-client' client.id %}
模板标签会输出以下的字符串 /clients/client/123/
.
若是您要检索名称空间网址,请指定彻底限定名称:
{% url 'myapp:view-name' %}
为了建立条形图等,此标签计算给定值与最大值的比率,而后将该比率应用于常量。
像这样:
<img src="bar.png" alt="Bar"
height="10" width="{% widthratio this_value max_value max_width %}" />
若是max_width
是175,max_value
是200,而且this_value
是100,则上述示例中的图像将是88像素宽(由于175 / 200 = .875; .875 * 100 = 87.5,上舍入为88)。
在某些状况下,您可能想要捕获变量中的widthratio
的结果。 它能够是有用的,例如,在blocktrans
像这样:
{% widthratio this_value max_value max_width as width %}
{% blocktrans %}The width is: {{ width }}{% endblocktrans %}
使用一个简单地名字缓存一个复杂的变量 ,当你须要使用一个“昂贵的”方法(好比访问数据库)不少次的时候是很是有用的
像这样:
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
填充变量(以上示例total
)仅适用于{% 与 %} t5>
和{% endwith %}
标签。
你能够分配多个上下文变量:
{% with alpha=1 beta=2 %}
...
{% endwith %}
参考文档: https://yiyibooks.cn/xx/Django_1.11.6/ref/templates/builtins.html#ref-templates-builtins-tags
Django内置模板标签
autoescape
block
comment
Csrf_token
cycle
debug
extends
filter
firstof
for
The current iteration of the loop (1-indexed)
变量 描述
forloop.counter 循环的当前迭代(1索引)
forloop.counter0 循环的当前迭代(0索引)
forloop.revcounter 循环结束的迭代次数(1索引)
forloop.revcounter0 循环结束的迭代次数(0索引)
forloop.first 若是这是第一次经过循环,则为真
forloop.last 若是这是最后一次循环,则为真
forloop.parentloop 对于嵌套循环,这是围绕当前循环的循环
for … empty
for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,能够有所操做。
它和下面的例子做用相等,可是更简洁、更清晰甚至可能运行起来更快:
if
布尔运算符
if标签可使用not,and或or来测试多个变量或取消给定变量:
容许同时使用and和or子句,and的优先级高于or :
解释以下:
在if标记中使用实际括号是无效的语法。 若是您须要它们指示优先级,则应使用嵌套的if标记。
== operator
相等。 例如:
!= operator
不相等。 例如:
<operator
小于。 例如:
operator
大于。 例如:
<= operator
小于或等于。 例如:
= operator
大于或等于。 例如:
in操做符
包含在内。 许多Python容器支持此运算符,以测试给定值是否在容器中。 如下是 中的x 的一些示例将被解释:
not in操做符
不包含在内。 这是in运算符的否认操做。
is operator
Django中的新功能1.10。
对象身份。 测试两个值是否相同。 例如:
is not操做符
Django中的新功能1.10。
否认对象身份 测试两个值是否不同。 这是is运算符的否认。 例如:
过滤器
你也能够在 if表达式中使用过滤器。 像这样:
复合表达式
全部上述操做符能够组合以造成复杂表达式。 对于这样的表达式,重要的是要知道在表达式求值时如何对运算符进行分组 - 即优先级规则。 操做符的优先级从低至高以下:
(这彻底依据Python)。 因此,例如,下面的复杂if标签:
…将被解释为:
若是你想要不一样的优先级,那么你须要使用嵌套的if 标签。 有时,为了清楚起见,更好的是为了那些不知道优先规则的人。
比较运算符不能像Python或数学符号中那样“连接”。 例如,不能使用:
你应该使用:
ifchanged
include
注
include 标签应该被理解为是一种”将子模版渲染并嵌入HTML中”的变种方法,而不是认为是”解析子模版并在被父模版包含的状况下展示其被父模版定义的内容”.这意味着在不一样的被包含的子模版之间并不共享父模版的状态,每个子包含都是彻底独立的渲染过程.
Block模块在被包含 以前 就已经被执行. 这意味着模版在被包含以前就已经从另外一个block扩展并 已经被执行并完成渲染 - 没有block模块会被include引入并执行,即便父模版中的扩展模版.
加载自定义模板标签集。
举个例子, 下面这模板将会从package包中载入全部otherlibrary 和somelibrary 中已经注册的标签和过滤器:
now
It is the {% now "jS \o\f F" %}
这将显示为“这是9月4日”。
传递的格式也能够是预约义的DATE_FORMAT,DATETIME_FORMAT,SHORT_DATE_FORMAT或SHORT_DATETIME_FORMAT之一。 预约义的格式可能会因当前语言环境和Format localization的启用而有所不一样,
例如:
regroup
而且想显示按国家/地区排序的分层列表,以下所示:
你可使用{% regroup %}标签来给每一个国家的城市分组。 如下模板代码片断将实现这一点:
{% regroup %}产生一个清单(在本例中为country_list的组对象。 组对象是具备两个字段的namedtuple()的实例:
在Django更改1.11:组对象已从字典更改成namedtuple()。
Because {% regroup %} produces namedtuple() objects, you can also write the previous example as:
请注意,{% regroup %}不会对其输入进行排序! 咱们的例子依赖于事实:cities列表首先由country排序。 若是country列表不经过cities对其成员进行排序,则从新分组将天真显示单个国家/地区的多个组。 例如,假设cities列表已设置为此(请注意,国家/地区未分组在一块儿):
对于cities的输入,示例{% regroup %}以上将致使如下输出:
这个问题的最简单的解决方案是确保在你的视图代码中,数据是根据你想要显示的顺序排序。
另外一个解决方案是使用dictsort过滤器对模板中的数据进行排序,若是您的数据在字典列表中:
分组其余属性
用法示例:
这个示例将返回下面的HTML:
注意第一个块以class=”odd”结束,新的以class=”odd”开头。 没有{% resetcycle %}标签,第二个块将以class=”even”
在这个例子中,咱们有交替的奇数/偶数行和第五行的“主要”行。 当类别更改时,只有五行周期被重置。
spaceless
templatetag
论据 输出
openblock {%
closeblock %}
openvariable {{
closevariable }}
openbrace {
closebrace }
opencomment {#
closecomment #}
例如:
url
不要忘记在url() name之间放置引号,不然该值将被解释为上下文变量!
verbatim
widthratio
with