测试开发之Django——No6.Django模板中的标签语言
模板中的标签语言
1.if/else
{% if %} 标签检查(evaluate)一个变量,如果这个变量为真(即:变量存在,非空,不是布尔值假),系统会显示在{% if %} 和
{% endif %}直接的任何内容。
例如:
{% if a %}
<p>Welcome to the weekend!</p>
{% endif %}
{% else %} 和 {% elif %} 标签是可选的
当然,是在根据需要来决定是否需要使用这个标签
2.布尔运算符
if标签可以使用and
,or
或not
测试多个变量或否定给定变量:
{% if athlete_list and coach_list %} Both athletes and coaches are available. {% endif %} {% if not athlete_list %} There are no athletes. {% endif %} {% if athlete_list or coach_list %} There are some athletes or some coaches. {% endif %} {% if not athlete_list or coach_list %} There are no athletes or there are some coaches. {% endif %} {% if athlete_list and not coach_list %} There are some athletes and absolutely no coaches. {% endif %}
允许在同一标记内使用both and
和or
子句, and
优先级高于or
例如:
{% if athlete_list and coach_list or cheerleader_list %}
将被解释为:
if (athlete_list and coach_list) or cheerleader_list
在if
标记中使用实际括号是无效的语法。如果需要它们来指示优先级,则应使用嵌套if
标记。
if
标签也可以使用运营商==
,!=
,<
,>
, <=
,>=
,in
,,,和它的工作如下:not in
is
is not
== 运算符:等于
!= 运算符:不等于
> 运算符:大于
< 运算符:小于
<= 运算符:小于等于
>= 运算符:大于等于
in 运算符:包含在内
not in 运算符:不包含
is 运算符:对象身份的判断,测试两个只是否是同一个对象
not is 运算符:测试两个是是否不是同一个对象
表达式的运算符优先规则(优先级从低到高):
or and not in == != < > <= >=
模板系统中,只有下面几种情况的布尔值是False:
1)空列表
2)空元组
3)空字符串
4)零值
5)特殊对象none
6)对象false
3.for
循环遍历数组中的每个项目,使项目在上下文变量中可用。例如,要显示以下提供的运动员列表 athlete_list
:
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
您可以使用反向循环遍历列表 。{% for obj in list reversed %}
如果需要循环列表列表,可以将每个子列表中的值解压缩为单个变量。例如,如果您的上下文包含调用的(x,y)坐标列表points
,则可以使用以下内容输出点列表:
{% for x, y in points %} There is a point at {{ x }},{{ y }} {% endfor %}
for循环设置循环中可用的许多变量:
变量 | 描述 |
---|---|
forloop.counter |
循环的当前迭代(1索引) |
forloop.counter0 |
循环的当前迭代(0索引) |
forloop.revcounter |
循环结束时的迭代次数(1索引) |
forloop.revcounter0 |
循环结束时的迭代次数(0索引) |
forloop.first |
如果这是第一次通过循环,则为真 |
forloop.last |
如果这是最后一次循环,则为真 |
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>
4 autoescape
控制当前的自动转义行为。此标记采用on
或 off
作为参数,并确定自动转义是否在块内生效。该块以endautoescape
结束标记关闭。
当自动转义生效时,所有变量内容都会在将结果放入输出之前对其应用HTML转义(但在应用任何过滤器之后)。这相当于手动将escape
过滤器应用于每个变量。
唯一的例外是已经标记为“安全”的变量,无论是通过填充变量的代码,还是因为它已经应用了safe
或escape
过滤器。
{% autoescape on %} {{ body }} {% endautoescape %}
5.block
定义可由子模板覆盖的块,例如:
{% block title %}{{ section.title }}{% endblock %}
6.comment
忽略和之间的所有内容。可以在第一个标签中插入可选的注释。例如,在注释掉用于记录代码被禁用的原因的代码时,这非常有用。{% comment %}
{% endcomment %}
<p>Rendered text with {{ pub_date|date:"c" }}</p> {% comment "Optional note" %} <p>Commented out text with {{ create_date|date:"c" }}</p> {% endcomment %}
comment
标签不能嵌套
7.csrf_token
此标记用于CSRF保护
8.extends
表示此模板扩展父模板的信号。
此标记可以以两种方式使用:
{% extends "base.html" %}
(带引号)使用文字值"base.html"
作为要扩展的父模板的名称。{% extends variable %}
使用的值variable
。如果变量求值为字符串,Django将使用该字符串作为父模板的名称。如果变量求值为一个Template
对象,Django将使用该对象作为父模板。
有关更多信息,请参见模板继承。
通常,模板名称相对于模板加载器的根目录。字符串参数也可以是以./
或开头的相对路径../
。
9.include
加载模板并使用当前上下文呈现它。这是一种在模板中“包含”其他模板的方法。
模板名称可以是单引号或双引号中的变量或硬编码(带引号)字符串。
此示例包含模板的内容"foo/bar.html"
:
{% include "foo/bar.html" %}
您可以使用关键字参数将其他上下文传递给模板:
{% include "name_snippet.html" with person="Jane" greeting="Hello" %}
10.load
加载自定义模板标记集。
{% load static %}
加载静态资源文件
11.now
使用根据给定字符串的格式显示当前日期和/或时间。此类字符串可以包含格式说明符字符,如date
过滤器部分中所述。
It is {% now "jS F Y H:i" %}
请注意,如果要使用“原始”值,则可以反斜杠转义格式字符串。在此示例中,“o”和“f”都是反斜杠转义的,因为否则每个都是一个格式字符串,分别显示年份和时间:
It is the {% now "jS \o\f F" %}
您还可以使用语法将输出(作为字符串)存储在变量中。如果要在模板标记内部使用 ,例如:{% now "Y" ascurrent_year %}
{% now %}
blocktrans
{% now "Y" as current_year %} {% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}
12.regroup
通过公共属性重新组合相似对象的列表。
这个复杂的标签,最好是用一个例子来说明:说不说cities
是包含字典代表城市的名单"name"
,"population"
和"country"
键:
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'}, ]
..并且您希望显示按国家/地区排序的分层列表,如下所示:
- 印度
- 孟买:19,000,000
- 加尔各答:15,000,000
- 美国
- 纽约:20,000,000
- 芝加哥:7,000,000
- 日本
- 东京:33,000,000
您可以使用标记按国家/地区对城市列表进行分组。以下代码片段代码将实现此目的:{% 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 %}
cities
country
country_list
{% regroup %}
生成一个组对象的列表(在本例中country_list
) 。组对象是包含两个字段的实例 :namedtuple()
grouper
- 按分组的项目(例如,字符串“India”或“Japan”)。list
- 该组中所有项目的列表(例如,所有具有country ='India'的城市的列表)。
使用dictsort
过滤器对模板中的数据进行排序 ,如果您的数据位于词典列表中
{% regroup cities|dictsort:"country" by country as country_list %}
对其他属性进行分组
任何有效的模板查找都是regroup标记的合法分组属性,包括方法,属性,字典键和列表项。例如,如果“country”字段是具有属性“description”的类的外键,则可以使用
{% regroup cities by country.description as country_list %}
13.url
返回与给定视图和可选参数匹配的绝对路径引用(不带域名的URL)。将使用编码生成的路径中的任何特殊字符iri_to_uri()
。
这是一种通过在模板中对URL进行硬编码来输出链接而不违反DRY原则的方法:
{% url 'some-url-name' v1 v2 %}
第一个参数是URL模式名称。它可以是带引号的文字或任何其他上下文变量。其他参数是可选的,应该是空格分隔的值,将用作URL中的参数。上面的例子显示了传递位置参数。或者,您可以使用关键字语法:
{% url 'some-url-name' arg1=v1 arg2=v2 %}
14.widthratio
对于创建条形图等,此标记计算给定值与最大值的比率,然后将该比率应用于常量。
如果this_value
是175,max_value
是200,并且max_width
是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 %}
15.with
以更简单的名称缓存复杂变量。这在多次访问“昂贵”方法(例如,击中数据库的方法)时很有用。
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
填充的变量(在上面的示例中total
)仅在和标记之间可用。{% with %}
{% endwith %}
您可以分配多个上下文变量:
{% with alpha=1 beta=2 %} ... {% endwith %}