测试开发之Django——No6.Django模板中的标签语言

时间:2023-03-08 20:05:48
测试开发之Django——No6.Django模板中的标签语言

模板中的标签语言

1.if/else

{% if  %} 标签检查(evaluate)一个变量,如果这个变量为真(即:变量存在,非空,不是布尔值假),系统会显示在{% if  %} 和

{% endif %}直接的任何内容。

例如:

{% if a %}

  <p>Welcome to the weekend!</p>

{% endif %}

{% else %} 和 {% elif %} 标签是可选的

当然,是在根据需要来决定是否需要使用这个标签

2.布尔运算符

if标签可以使用andornot测试多个变量或否定给定变量:

{% 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 andor子句, 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 inisis 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>

  

autoescape

控制当前的自动转义行为。此标记采用on或 off作为参数,并确定自动转义是否在块内生效。该块以endautoescape结束标记关闭。

当自动转义生效时,所有变量内容都会在将结果放入输出之前对其应用HTML转义(但在应用任何过滤器之后)。这相当于手动将escape 过滤器应用于每个变量。

唯一的例外是已经标记为“安全”的变量,无论是通过填充变量的代码,还是因为它已经应用了safeescape过滤器。

{% 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 %}citiescountrycountry_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 %}