一对花括号和百分号包围的文本是模板标签,Django框架有一些内置的常用标签
1、{% if %} 标签
{% if %} 计算变量的值,如果为真(即存在、不为空,不是假值),模板系统显示 {% if %} 和 {% endif %} 之间的内容。
如上一篇中的例子,我们判断同学的性别,然后根据性别称呼他们为“大侠”或“女侠”
{% if s.0 == 'male' %}
<li>{
{ s.1 }}大侠</li>
{% else %}
<li>{
{ s.1 }}女侠</li>
{% endif %}
if 标签还可以有一个或多个 {% elif %} 子句,支持使用 and、or 或 not 测试多个变量
{% if s.age <18 %}
<li>{
{ s.name }}少侠</li>
{% elif s.sex = 'male' and s.age<50 %}
<li>{
{ s.name }}大侠</li>
{% elif s.sex = 'female' and s.age<50 %}
<li>{
{ s.name }}女侠</li>
{% elif s.age >=50 %}
<li>{
{ s.name }}前辈</li>
{% else %}
<li>{
{ s.name }}壮士</li>
{% endif %}
同一个标签中可以同时使用 and 和 or,前者的优先级较高。
在 if 标签中使用括号是无效的句法。如果想指明优先级,应该使用嵌套的 if 标签。
if 标签还可以使用 ==、!=、、= 和 in 等运算符
运算符 | 示例 |
---|---|
== | {% if somevar == x %}… |
!= | {% if somevar != x %} … |
< | {% if somevar < 100 %} … |
> | {% if somevar > 10 %} … |
<= | {% if somevar <= 100 %}... |
>= | {% if somevar >= 10 %} … |
in | {% if bc in abcdef %} |
2、{% for %} 标签
这个标签用于迭代序列中的各个元素。与 Python 的 for 语句一样,句法是 for X in Y,其中 Y 是要迭 代的序列,X 是单次循环中使用的变量。每次迭代时,模板系统会渲染 {% for %} 和 {% endfor %} 之间的内容。
上一篇举例的 {% for s in student_list %},就可以列出student_list中的所有学生
如果需要迭代由列表构成的列表,可以把每个子列表中的值拆包到独立的变量中。 比如说上下文中有一个包含 (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 %}
通常,迭代列表之前要先检查列表是否为空,如果为空可以插入一些特殊字符
因此 for 标签支持一个可选的 {% empty %} 子句,用于定义列表为空时显示的内容。
{% for s in student_list %}
<p>{
{ s.name }}</p>
{% empty %}
<p>这位侠客没有名字</p>
{% endfor %}
与Python不同的是 :在循环结束之前,无法“跳出”。如果需要这么做,修改要迭代的变量,只包含需要迭代的值。 同样,也没有“continue”语句,不能立即返回到循环的开头。
在 {% for %} 循环内部,可以访问一个名为 forloop 的模板变量。这个变量有几个属性,通过它们可以获知 循环进程的一些信息:
• forloop.counter 的值是一个整数,表示循环的次数。这个属性的值从 1 开始,因此第一次循环时, forloop.counter 等于 1。下面举个例子:
{% for item in todo_list %}
{
{ forloop.counter }}: {
{ item }}
{% endfor %}
• forloop.counter0 与 forloop.counter 类似,不过是从零开始的。第一次循环时,其值为 0。
• forloop.revcounter 的值是一个整数,表示循环中剩余的元素数量。第一次循环时,forloop.revcounter的值是序列中要遍历的元素总数。最后一次循环时,forloop.revcounter 的值为 1。
• forloop.revcounter0 与 forloop.revcounter 类似,不过索引是基于零的。第一次循环时,forloop.revcounter0 的值是序列中元素数量减去一。最后一次循环时,forloop.revcounter0 的值为 0。
• forloop.first 是个布尔值,第一次循环时为 True。需要特殊处理第一个元素时很方便:
{% for object in objects %}
{% if forloop.first %}
<li class="first">
{% else %}
<li>
{% endif %}
{
{ object }}
</li>
{% endfor %}
• forloop.last 是个布尔值,最后一次循环时为 True。经常用它在一组链接之间放置管道符号:
{% for link in links %}
{
{ link }}{% if not forloop.last %} | {% endif %}
{% endfor %}
上述模板代码的输出可能是: Link1 | Link2 | Link3 | Link4
3、{% ifequal %} 标签
这个标签比较两个值,如果相等,显示 {% ifequal %} 和 {% endifequal %} 之间的内容。
{% ifequal user currentuser %}
<h1>Welcome!</h1>
{% endifequal %}
与 {% if %} 一样,{% ifequal %} 标签支持可选的 {% else %} 子句:
{% ifequal user currentuser %}
<h1>Welcome</h1>
{% else %}
<h1>Getout</h1>
{% endifequal %}
{% ifequal %} 的参数只能是模板变量、字符串、整数和小数。
下面是有效的示例:
{% ifequal variable 1 %}
{% ifequal variable 1.23 %}
{% ifequal variable 'foo' %}
{% ifequal variable "foo" %}
其他变量类型,例如 Python 字典、列表或布尔值,不能在 {% ifequal %} 中硬编码。
下面是无效的示例:
{% ifequal variable True %}
{% ifequal variable [1, 2, 3] %}
{% ifequal variable {'key': 'value'} %}
如果想测试真假,应该使用 {% if %} 标签。
ifequal 标签可以替换成 if 标签和 == 运算符。
{% ifnotequal %} 的作用与 ifequal 类似,不过它测试两个参数是否不相等。
ifnotequal 标签可以替换成 if 标签和 != 运算符。
4、{% block %} 标签
定义可由子模板覆盖父模板的块。详情见上一篇帖子。
5、{% comment %}标签
忽略 {% comment %} 和 {% endcomment %} 之间的全部内容。
起始标签可以添加可选的注解,例如说明为何要 注释掉代码。
comment 标签不能嵌套。
6、 {% csrf_token %}标签
这个标签提供 CSRF 防护。在用表单进行交互的时候要加上这个标签。
7、{% extends %}标签
表明所在模板扩展某个父模板。这个标签有两种用法:
1. {% extends "base.html" %}(有引号),以字面值 "base.html" 为父模板的名称。
2. {% extends variable %} 以 variable 的值为父模板的名称。如果 variable 的求值结果是一个字符串, Django 以那个字符串为父模板的名称;如果求值结果是一个 Template 对象,Django 使用那个对象为父模板。
8、{% cycle %}标签
每执行这个标签一次输出参数中的一个值。第一次执行输出第一个参数,第二次执行输出第二个参数,以此 类推。所有参数都输出一遍之后,回到第一个参数,再依次输出。这个标签在循环中特别有用: {% for o in some_list %}.
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
第一次迭代生成的 HTML 使用 row1 类,第二次迭代使用 row2 类,第三次迭代使用 row1 类,以此类推。参数的值也可以通过变量指定。
假如有两个模板变量 rowvalue1 和 rowvalue2,可以像这样在二者的值之间切 换:
{% for o in some_list %}
<tr class="{% cycle rowvalue1 rowvalue2 %}">
...
</tr>
{% endfor %}
此外,也可以混用变量和字符串:
{% for o in some_list %}
<tr class="{% cycle 'row1' rowvalue2 'row3' %}">
...
</tr>
{% endfor %}
一个 cycle 标签中可以使用任意多个值(以空格分开)。放在单引号(')或双引号(")中的值视作字符串字面量,没有引号的视为模板变量。
9、{% include %}标签
加载一个模板,在当前上下文中渲染。这是在模板中引入其他模板的方式。模板的名称可以是一个变量:
{% include template_name %}
或者硬编码的字符串(有引号):
{% include "foo/bar.html" %}
10、{% load %}标签
加载自定义的模板标签。例如,下述模板代码加载 somelibrary 和 package 包中 otherlibrary 注册的全部标签和过滤器:
{% load somelibrary package.otherlibrary %}
此外,还可以使用 from 参数有选择地从库中加载具体的过滤器和标签。 下述示例从 somelibrary 中加载名为 foo 和 bar 的标签或过滤器:
{% load foo bar from somelibrary %}
11、{% filter %}标签
使用一个或多个过滤器过滤内容块。过滤器的内容下个帖子详细说。