内置模板标记和筛选器

本文档描述了Django的内置模板标记和过滤器。建议您使用 automatic documentation ,如果可用,因为这还将包括安装的任何自定义标记或筛选器的文档。

内置标记引用

autoescape

控制当前的自动转义行为。这个标签 onoff 作为参数,它决定自动转义是否在块内有效。该块用一个 endautoescape 结束标签。

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

唯一的例外是已经被标记为“安全”的变量,它们不会被转义,要么是由填充该变量的代码,要么是因为它具有 safeescape 已应用筛选器。

样品使用情况:

{% autoescape on %}
    {{ body }}
{% endautoescape %}

block

定义可由子模板重写的块。见 Template inheritance 更多信息。

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 不能嵌套标记。

csrf_token

此标签用于CSRF保护,如文档中所述 Cross Site Request Forgeries .

cycle

每次遇到此标记时都生成其参数之一。第一个论点是在第一次相遇时产生的,第二次相遇时产生的,等等。一旦所有参数都用完了,标记就循环到第一个参数并再次生成它。

此标记在循环中特别有用:

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}

第一次迭代生成引用类的HTML row1 第二个 row2 ,第三到 row1 同样,对于循环的每个迭代都是如此。

你也可以使用变量。例如,如果有两个模板变量, rowvalue1rowvalue2 ,您可以在它们的值之间进行替换,如下所示:

{% for o in some_list %}
    <tr class="{% cycle rowvalue1 rowvalue2 %}">
        ...
    </tr>
{% endfor %}

循环中包含的变量将被转义。您可以使用以下命令禁用自动转义:

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

在某些情况下,您可能希望引用循环的当前值,而不前进到下一个值。为此,只需 {{% cycle %}} 使用“as”标记名称,如下所示:

{% cycle 'row1' 'row2' as rowcolors %}

从那时起,通过将循环名称作为上下文变量引用,您可以在模板中任意位置插入循环的当前值。如果要将循环移动到下一个独立于原始值的值 cycle 标签,你可以用另一个 cycle 标记并指定变量的名称。因此,下面的模板:

<tr>
    <td class="{% cycle 'row1' 'row2' as rowcolors %}">...</td>
    <td class="{{ rowcolors }}">...</td>
</tr>
<tr>
    <td class="{% cycle rowcolors %}">...</td>
    <td class="{{ rowcolors }}">...</td>
</tr>

输出:

<tr>
    <td class="row1">...</td>
    <td class="row1">...</td>
</tr>
<tr>
    <td class="row2">...</td>
    <td class="row2">...</td>
</tr>

您可以在 cycle 标签,用空格分隔。单引号括起的值 (' )或双引号 (" )被视为字符串文本,而不带引号的值被视为模板变量。

默认情况下,当使用 as 关键字与循环标记,使用 {{% cycle %}} 启动循环的函数本身将产生循环中的第一个值。如果要在嵌套循环或包含的模板中使用该值,这可能是一个问题。如果只想声明循环,但不生成第一个值,则可以添加 silent 关键字作为标记中的最后一个关键字。例如::

{% for obj in some_list %}
    {% cycle 'row1' 'row2' as rowcolors silent %}
    <tr class="{{ rowcolors }}">{% include "subtemplate.html" %}</tr>
{% endfor %}

这将输出一个列表 <tr> 元素与 class 两者交替 row1row2 . 子模板将可以访问 rowcolors 在其上下文中,该值将与 <tr> 包围着它。如果 silent 省略关键词, row1row2 将作为普通文本发出,在 <tr> 元素。

当在循环定义中使用silent关键字时,silence将自动应用于该特定循环标记的所有后续使用。以下模板将输出 没有什么 即使第二次调用 {{% cycle %}} 不指定 silent ::

{% cycle 'row1' 'row2' as rowcolors silent %}
{% cycle rowcolors %}

你可以使用 resetcycle 标签制作 {{% cycle %}} 当下次遇到标记时,从它的第一个值重新启动。

debug

输出一整套调试信息,包括当前上下文和导入的模块。

extends

表示此模板扩展父模板。

此标记可通过两种方式使用:

  • {{% extends "base.html" %}} (带引号)使用文字值 "base.html" 作为要扩展的父模板的名称。
  • {{% extends variable %}} 使用的值 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" %}

filter

通过一个或多个筛选器筛选块的内容。可以用管道指定多个过滤器,并且过滤器可以有参数,就像在变量语法中一样。

请注意,该块包括 all 文本介于 filterendfilter 标签。

样品使用情况:

{% filter force_escape|lower %}
    This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}

注解

这个 escapesafe 筛选器不是可接受的参数。相反,使用 autoescape 标记来管理模板代码块的自动转义。

firstof

输出第一个参数变量 False . 如果所有传递的变量都是 False .

样品使用情况:

{% firstof var1 var2 var3 %}

这相当于:

{% if var1 %}
    {{ var1 }}
{% elif var2 %}
    {{ var2 }}
{% elif var3 %}
    {{ var3 }}
{% endif %}

您还可以使用文本字符串作为回退值,以防所有传递的变量都为false::

{% firstof var1 var2 var3 "fallback value" %}

此标记自动转义变量值。您可以使用以下命令禁用自动转义:

{% autoescape off %}
    {% firstof var1 var2 var3 "<strong>fallback value</strong>" %}
{% endautoescape %}

或者,如果只应转义某些变量,则可以使用::

{% firstof var1 var2|safe var3 "<strong>fallback value</strong>"|safe %}

您可以使用语法 {{% firstof var1 var2 var3 as value %}} 将输出存储在变量中。

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

如果需要访问字典中的项目,这也很有用。例如,如果上下文包含字典 data ,下面将显示字典的键和值:

{% for key, value in data.items %}
    {{ key }}: {{ value }}
{% endfor %}

请记住,对于点运算符,字典键查找优先于方法查找。因此,如果 data 字典包含一个名为 'items'data.items 将返回 data['items'] 而不是 data.items() . 如果要在模板中使用这些方法,请避免添加类似字典方法的键。 (itemsvalueskeys 等)。阅读中有关点运算符查找顺序的详细信息 documentation of template variables .

for循环设置循环中可用的变量数:

变量 描述
forloop.counter 循环的当前迭代(1个索引)
forloop.counter0 循环的当前迭代(0-索引)
forloop.revcounter 循环结束时的迭代次数(1个索引)
forloop.revcounter0 循环结束时的迭代次数(0-索引)
forloop.first 如果这是第一次通过循环,则为真
forloop.last 如果这是最后一次通过循环,则为真
forloop.parentloop 对于嵌套循环,这是围绕当前循环的循环

for ... empty

这个 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

这个 {{% if %}} 标记计算变量,如果该变量为“真”(即存在、不为空且不是假布尔值),则输出块的内容::

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

如你所见, if 标签可能需要一个或多个 {{% elif %}} 条款,以及 {{% else %}} 如果所有以前的条件都失败,将显示的子句。这些条款是可选的。

布尔运算符

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

两者的使用 andor 允许使用同一标记内的子句,其中 and 优先级高于 or 例如。::

{% if athlete_list and coach_list or cheerleader_list %}

将被解释为:

if (athlete_list and coach_list) or cheerleader_list

实际括号的使用 if 标记的语法无效。如果需要它们指示优先级,则应使用嵌套 if 标签。

if 标记也可以使用运算符 ==!=<><=>=innot inisis not 其工作原理如下:

== 操作人员

平等。例子::

{% if somevar == "x" %}
  This appears if variable somevar equals the string "x"
{% endif %}
!= 操作人员

不平等。例子::

{% if somevar != "x" %}
  This appears if variable somevar does not equal the string "x",
  or if somevar is not found in the context
{% endif %}
< 操作人员

小于。例子::

{% if somevar < 100 %}
  This appears if variable somevar is less than 100.
{% endif %}
> 操作人员

大于。例子::

{% if somevar > 0 %}
  This appears if variable somevar is greater than 0.
{% endif %}
<= 操作人员

小于或等于。例子::

{% if somevar <= 100 %}
  This appears if variable somevar is less than 100 or equal to 100.
{% endif %}
>= 操作人员

大于或等于。例子::

{% if somevar >= 1 %}
  This appears if variable somevar is greater than 1 or equal to 1.
{% endif %}
in 操作人员

包含在中。许多Python容器都支持此运算符来测试给定值是否在容器中。以下是一些如何 x in y 将被解释为:

{% if "bc" in "abcdef" %}
  This appears since "bc" is a substring of "abcdef"
{% endif %}

{% if "hello" in greetings %}
  If greetings is a list or set, one element of which is the string
  "hello", this will appear.
{% endif %}

{% if user in users %}
  If users is a QuerySet, this will appear if user is an
  instance that belongs to the QuerySet.
{% endif %}
not in 操作人员

不包含在中。这是对 in 操作员。

is 操作人员

对象标识。测试两个值是否为同一对象。例子::

{% if somevar is True %}
  This appears if and only if somevar is True.
{% endif %}

{% if somevar is None %}
  This appears if somevar is None, or if somevar is not found in the context.
{% endif %}
is not 操作人员

否定的对象标识。测试两个值是否不是同一对象。这是对 is 操作员。例子::

{% if somevar is not True %}
  This appears if somevar is not True, or if somevar is not found in the
  context.
{% endif %}

{% if somevar is not None %}
  This appears if and only if somevar is not None.
{% endif %}

过滤器

您也可以在 if 表达式。例如::

{% if messages|length >= 100 %}
   You have lots of messages today!
{% endif %}

复杂表达式

所有这些都可以组合成复杂的表达式。对于此类表达式,在计算表达式(即优先级规则)时,了解如何对运算符进行分组是很重要的。运算符的优先级从低到高如下:

  • or
  • and
  • not
  • in
  • ==, !=, <, >, <=, >=

(这完全遵循Python)。例如,下面的复杂 if 标签:

{% if a == b or c == d and e %}

…将解释为:

(a == b) or ((c == d) and e)

如果需要不同的优先级,则需要使用嵌套 if 标签。有时,为了那些不知道优先规则的人,这样做更清楚。

比较运算符不能像在python或数学符号中那样“链接”。例如,而不是使用:

{% if a > b > c %}  (WRONG)

你应该使用:

{% if a > b and b > c %}

ifequal and ifnotequal

{{% ifequal a b %}} ... {{% endifequal %}} 是一种过时的书写方式 {{% if a == b %}} ... {{% endif %}} . 同样地, {{% ifnotequal a b %}} ... {{% endifnotequal %}} 已被取代 {{% if a != b %}} ... {{% endif %}} . 这个 ifequalifnotequal 在将来的版本中将不再使用标记。

ifchanged

检查值是否已从循环的最后一次迭代更改。

这个 {{% ifchanged %}} 块标记在循环中使用。它有两种可能的用途。

  1. 检查其自己呈现的内容与以前的状态,并且仅在内容发生更改时显示内容。例如,这将显示一个天数列表,仅在月份更改时显示:

    <h1>Archive for {{ year }}</h1>
    
    {% for date in days %}
        {% ifchanged %}<h3>{{ date|date:"F" }}</h3>{% endifchanged %}
        <a href="{{ date|date:"M/d"|lower }}/">{{ date|date:"j" }}</a>
    {% endfor %}
    
  2. 如果给定一个或多个变量,请检查是否有任何变量发生了更改。例如,下面显示的是每次更改的日期,如果小时或日期发生了更改,则显示小时:

    {% for date in days %}
        {% ifchanged date.date %} {{ date.date }} {% endifchanged %}
        {% ifchanged date.hour date.date %}
            {{ date.hour }}
        {% endifchanged %}
    {% endfor %}
    

这个 ifchanged 标签也可以选择 {{% else %}} 如果值未更改将显示的子句::

{% for match in matches %}
    <div style="background-color:
        {% ifchanged match.ballot_id %}
            {% cycle "red" "blue" %}
        {% else %}
            gray
        {% endifchanged %}
    ">{{ match }}</div>
{% endfor %}

include

加载模板并用当前上下文呈现。这是一种在模板中“包括”其他模板的方法。

模板名称可以是变量或硬编码(带引号)字符串,可以是单引号或双引号。

此示例包括模板的内容 "foo/bar.html" ::

{% include "foo/bar.html" %}

通常,模板名称是相对于模板加载器的根目录的。字符串参数也可以是以开头的相对路径 ./../ 如中所述 extends 标签。

此示例包括名称包含在变量中的模板的内容 template_name ::

{% include template_name %}

变量也可以是具有 render() 接受上下文的方法。这允许您引用已编译的 Template 在你的背景下。

包含的模板在包含它的模板的上下文中呈现。此示例生成输出 "Hello, John!"

  • 上下文:变量 person 设置为 "John" 变量 greeting 设置为 "Hello" .

  • 模板:

    {% include "name_snippet.html" %}
    
  • 这个 name_snippet.html 模板:

    {{ greeting }}, {{ person|default:"friend" }}!
    

可以使用关键字参数将其他上下文传递到模板:

{% include "name_snippet.html" with person="Jane" greeting="Hello" %}

如果只想使用提供的变量(甚至根本没有变量)呈现上下文,请使用 only 选择权。包含的模板没有其他可用变量:

{% include "name_snippet.html" with greeting="Hi" only %}

注解

这个 include 标记应被视为“呈现此子模板并包含HTML”的实现,而不是“解析此子模板并将其内容包含为父模板的一部分”。这意味着包含的模板之间没有共享状态——每个包含都是一个完全独立的呈现过程。

对块进行评估 之前 包括在内。这意味着包含来自另一个的块的模板将包含具有 已经过评估和呈现 -不能被扩展模板等覆盖的块。

load

加载自定义模板标记集。

例如,下面的模板将加载在 somelibraryotherlibrary 位于包装内 package ::

{% load somelibrary package.otherlibrary %}

您还可以使用 from 争论。在本例中,模板标记/过滤器名为 foobar 将从加载 somelibrary ::

{% load foo bar from somelibrary %}

Custom tag and filter libraries 更多信息。

lorem

显示随机的“lorem ipsum”拉丁文本。这对于在模板中提供示例数据很有用。

用法:

{% lorem [count] [method] [random] %}

这个 {{% lorem %}} 标记可以与零、一、二或三个参数一起使用。参数如下:

论证 描述
count 包含要生成的段落或单词数的数字(或变量)(默认值为1)。
method 要么 w 为了语言, p 对于HTML段落或 b 对于纯文本段落块(默认为 b
random 单词 random 如果给定,则在生成文本时不使用常用段落(“lorem ipsum dolor sit amet…”)。

实例:

  • {{% lorem %}} 将输出常见的“lorem ipsum”段落。
  • {{% lorem 3 p %}} 将输出常用的“lorem ipsum”段落和两个随机段落,每个段落用HTML包装 <p> 标签。
  • {{% lorem 2 w random %}} 将输出两个随机拉丁词。

now

根据给定字符串使用格式显示当前日期和/或时间。此类字符串可以包含格式说明符字符,如 date 过滤部分。

例子::

It is {% now "jS F Y H:i" %}

请注意,如果要使用“原始”值,可以反斜杠转义格式字符串。在本例中,“o”和“f”都是反斜杠转义的,因为否则每一个都是分别显示年份和时间的格式字符串:

It is the {% now "jS \o\f F" %}

这将显示为“9月4日”。

注解

传递的格式也可以是预定义的格式之一 DATE_FORMATDATETIME_FORMATSHORT_DATE_FORMATSHORT_DATETIME_FORMAT . 根据当前区域设置和如果 格式本地化 已启用,例如:

It is {% now "SHORT_DATETIME_FORMAT" %}

您还可以使用语法 {{% now "Y" as current_year %}} 将输出(作为字符串)存储在变量中。如果你想用这个 {{% now %}} 在模板标记中 blocktrans 例如::

{% now "Y" as current_year %}
{% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}

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'},
]

…您希望显示按国家排序的分层列表,如下所示:

  • 印度
    • 孟买:19000000
    • 加尔各答:15000000
  • USA
    • 纽约:20000000
    • 芝加哥:70万
  • 日本
    • 东京:33000000

你可以使用 {{% 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'的所有城市的列表)。

因为 {{% regroup %}} 生产 namedtuple() 对象,还可以将上一个示例编写为:

{% 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 首先。如果 cities 列表做 not 命令其成员 country 对于一个国家,重组会天真地显示出不止一个群体。例如,说 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 %}} 上面的模板代码将导致以下输出:

  • 印度
    • 孟买:19000000
  • USA
    • 纽约:20000000
  • 印度
    • 加尔各答:15000000
  • USA
    • 芝加哥:70万
  • 日本
    • 东京:33000000

这个gotcha的最简单的解决方案是确保在视图代码中,数据是按照您想要显示的方式排序的。

另一种解决方案是使用 dictsort 筛选,如果数据在字典列表中:

{% regroup cities|dictsort:"country" by country as country_list %}

按其他属性分组

任何有效的模板查找都是重新组合标记的合法分组属性,包括方法、属性、字典键和列表项。例如,如果“country”字段是具有属性“description”的类的外键,则可以使用:

{% regroup cities by country.description as country_list %}

或者,如果 country 是一个字段 choices ,它将有一个 get_FOO_display() 方法作为属性提供,允许您分组显示字符串而不是 choices 关键点:

{% regroup cities by get_country_display as country_list %}

{{{{ country.grouper }}}} 现在将显示 choices 设置而不是键。

resetcycle

重置上一个 cycle 以便在下次遇到时从第一个项目重新启动。没有争论, {{% 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" .

您还可以重置命名循环标记:

{% for item in list %}
    <p class="{% cycle 'odd' 'even' as stripe %} {% cycle 'major' 'minor' 'minor' 'minor' 'minor' as tick %}">
        {{ item.data }}
    </p>
    {% ifchanged item.category %}
        <h1>{{ item.category }}</h1>
        {% if not forloop.first %}{% resetcycle tick %}{% endif %}
    {% endifchanged %}
{% endfor %}

在这个例子中,我们每五行都有交替的奇数行/偶数行和一个“主要”行。当类别更改时,仅重置五行循环。

spaceless

删除HTML标记之间的空白。这包括制表符和换行符。

示例用法:

{% spaceless %}
    <p>
        <a href="foo/">Foo</a>
    </p>
{% endspaceless %}

此示例将返回此HTML::

<p><a href="foo/">Foo</a></p>

只有间距 tags 删除了标记和文本之间的空格。在这个例子中,周围的空间 Hello 不会被剥离:

{% spaceless %}
    <strong>
        Hello
    </strong>
{% endspaceless %}

templatetag

输出用于组成模板标记的语法字符之一。

由于模板系统没有“转义”的概念,要显示模板标记中使用的一个位,必须使用 {{% templatetag %}} 标签。

参数告诉输出哪个模板位:

论证 输出
openblock {%
closeblock %}
openvariable {{
closevariable }}
openbrace {
closebrace }
opencomment {#
closecomment #}

样品使用情况:

{% templatetag openblock %} url 'entry_list' {% templatetag closeblock %}

url

返回与给定视图和可选参数匹配的绝对路径引用(没有域名的URL)。结果路径中的任何特殊字符都将使用 iri_to_uri() .

这是一种在不违反dry原则的情况下输出链接的方法,即在模板中硬编码URL::

{% url 'some-url-name' v1 v2 %}

第一个论点是 URL pattern name . 它可以是带引号的文字或任何其他上下文变量。其他参数是可选的,应该是空格分隔的值,这些值将用作URL中的参数。上面的示例显示传递位置参数。或者,您可以使用关键字语法::

{% url 'some-url-name' arg1=v1 arg2=v2 %}

不要在单个调用中混合使用位置语法和关键字语法。urlconf所需的所有参数都应存在。

例如,假设您有一个视图, app_views.client ,其urlconf获取客户端ID(此处, client() 是视图文件中的方法 app_views.py )urlconf行可能如下所示:

path('client/<int:id>/', app_views.client, name='app-views-client')

如果此应用程序的urlconf包含在项目的urlconf中,路径如下:

path('clients/', include('project_name.app_name.urls'))

…然后,在模板中,可以创建指向此视图的链接,如下所示:

{% url 'app-views-client' client.id %}

模板标记将输出字符串 /clients/client/123/ .

请注意,如果要反转的URL不存在,您将得到一个 NoReverseMatch 引发异常,这将导致网站显示错误页。

如果要检索一个URL而不显示它,可以使用稍微不同的调用::

{% url 'some-url-name' arg arg2 as the_url %}

<a href="{{ the_url }}">I'm linking to {{ the_url }}</a>

由创建的变量的范围 as var 语法是 {{% block %}} 其中 {{% url %}} 标签出现。

这个 {{% url ... as var %}} 语法意志 not 如果视图丢失,则会导致错误。在实践中,您将使用此链接到可选视图:

{% url 'some-url-name' as the_url %}
{% if the_url %}
  <a href="{{ the_url }}">Link to optional stuff</a>
{% endif %}

如果要检索命名空间URL,请指定完全限定名::

{% url 'myapp:view-name' %}

这是正常的 namespaced URL resolution strategy 包括使用上下文提供的有关当前应用程序的任何提示。

警告

别忘了在URL模式周围加引号 name 否则,该值将被解释为上下文变量!

verbatim

阻止模板引擎呈现此块标记的内容。

一个常见的用法是允许与Django语法冲突的JavaScript模板层。例如::

{% verbatim %}
    {{if dying}}Still alive.{{/if}}
{% endverbatim %}

您还可以指定一个特定的结束标记,允许使用 {{% endverbatim %}} 作为未分发内容的一部分:

{% verbatim myblock %}
    Avoid template rendering via the {% verbatim %}{% endverbatim %} block.
{% endverbatim myblock %}

widthratio

对于创建条形图等,此标记计算给定值与最大值的比率,然后将该比率应用于常量。

例如::

<img src="bar.png" alt="Bar"
     height="10" width="{% widthratio this_value max_value max_width %}">

如果 this_value 是175, max_value 是200, max_width 为100,上面示例中的图像将为88像素宽(因为175/200=0.875;.875*100=87.5,四舍五入为88)。

在某些情况下,您可能希望捕获 widthratio 在变量中。例如,它可以在 blocktrans 这样地::

{% widthratio this_value max_value max_width as width %}
{% blocktrans %}The width is: {{ width }}{% endblocktrans %}

with

以更简单的名称缓存复杂变量。这在多次访问“昂贵”方法(例如,访问数据库的方法)时很有用。

例如::

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

填充变量(在上面的示例中, total )仅在 {{% with %}}{{% endwith %}} 标签。

您可以分配多个上下文变量:

{% with alpha=1 beta=2 %}
    ...
{% endwith %}

注解

仍支持以前更详细的格式: {{% with business.employees.count as total %}}

内置筛选器引用

add

将参数添加到值中。

例如::

{{ value|add:"2" }}

如果 value4 ,则输出为 6 .

此筛选器将首先尝试将两个值强制为整数。如果失败,它将尝试将这些值相加。这将对某些数据类型(字符串、列表等)有效,而对其他数据类型无效。如果失败,结果将是一个空字符串。

例如,如果我们有:

{{ first|add:second }}

first[1, 2, 3]second[4, 5, 6] ,则输出为 [1, 2, 3, 4, 5, 6] .

警告

可以强制为整数的字符串将 总结 ,不连接,如上面的第一个示例中所示。

addslashes

在引号前添加斜线。例如,对于在csv中转义字符串很有用。

例如::

{{ value|addslashes }}

如果 value"I'm using Django" ,输出为 "I\'m using Django" .

capfirst

将值的第一个字符大写。如果第一个字符不是字母,则此筛选器无效。

例如::

{{ value|capfirst }}

如果 value"django" ,输出为 "Django" .

center

将给定宽度的字段中的值居中。

例如::

"{{ value|center:"15" }}"

如果 value"Django" ,输出为 "     Django    " .

cut

从给定字符串中删除arg的所有值。

例如::

{{ value|cut:" " }}

如果 value"String with spaces" ,输出为 "Stringwithspaces" .

date

根据给定格式设置日期格式。

使用与PHP类似的格式 date() 函数(https://php.net/date)存在一些差异。

注解

这些格式字符不在模板之外的Django中使用。它们被设计成与PHP兼容,以方便设计师进行转换。

可用格式字符串:

设置字符格式 描述 实例输出
Day    
d 每月的某一天,2位数字,前导零。 '01' to '31'
j 月份中没有前导零的日期。 '1' to '31'
D 一周中的某一天,文本,3个字母。 'Fri'
l 一周中的某一天,文本,漫长。 'Friday'
S 月日的英文序数后缀,2个字符。 'st', 'nd', 'rd' or 'th'
w 星期几,不带前导零的数字。 '0' (星期日) '6' (星期六)
z 一年中的某一天。 0 to 365
Week    
W ISO-8601每年的第几周,从星期一开始。 1, 53
月份    
m 月,2位数字,前导零。 '01' to '12'
n 月份没有前导零。 '1' to '12'
M 月,文本,3个字母。 'Jan'
b 月,文本,3个字母,小写。 'jan'
E 月份,特定于区域设置的可选表示,通常用于长日期表示。 'listopada' (波兰地区,而不是 'Listopad'
F 月,文本,长。 'January'
N 美联社样式中的月份缩写。专有扩展。 'Jan.', 'Feb.', 'March', 'May'
t 给定月份中的天数。 28 to 31
Year    
y 一年,2位数。 '99'
Y 一年,4位数。 '1999'
L 布尔值表示是否为闰年。 True or False
o ISO-8601周编号年份,对应于使用闰周的ISO-8601周编号(W)。有关更常见的年份格式,请参见Y。 '1999'
Time    
g 小时,12小时格式,不带前导零。 '1' to '12'
G 小时,24小时格式,不带前导零。 '0' to '23'
h 小时,12小时格式。 '01' to '12'
H 小时,24小时制。 '00' to '23'
i 分钟。 '00' to '59'
s 秒,2位数,前导零。 '00' to '59'
u 微秒。 000000 to 999999
a 'a.m.''p.m.' (请注意,这与PHP的输出稍有不同,因为这包括与相关新闻样式匹配的句点。) 'a.m.'
A 'AM''PM' . 'AM'
f 时间,12小时分,如果是零,还有分钟。专有扩展。 '1', '1:30'
P 时间,以12小时、分钟和“a.m.”和“p.m.”为单位,如果为零,则剩余分钟,如果合适,特殊情况下字符串为“午夜”和“中午”。专有扩展。 '1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.'
时区    
e 时区名称。可以是任何格式,也可以返回空字符串,具体取决于日期时间。 '''GMT''-500''US/Eastern' 等。
I 夏令时,不管它是否有效。 '1' or '0'
O 以小时为单位的格林威治时间差。 '+0200'
T 这台机器的时区。 'EST', 'MDT'
Z 时区偏移(秒)。UTC以西时区的偏移量始终为负,而UTC以东时区的偏移量始终为正。 -43200 to 43200
Date/Time    
c ISO 8601格式。(注意:与其他格式化程序(如“z”、“o”或“r”)不同,“c”格式化程序不会在值是原始日期时间时添加时区偏移量(请参见 datetime.tzinfo 2008-01-02T10:30:00.000123+02:002008-01-02T10:30:00.000123 如果日期时间是幼稚的
r RFC 5322 格式化日期。 'Thu, 21 Dec 2000 16:01:07 +0200'
U 自Unix时代以来的秒数(1970年1月1日00:00:00 UTC)。  

例如::

{{ value|date:"D d M Y" }}

如果 value 是一个 datetime 对象(例如,结果 datetime.datetime.now() ,输出将是字符串 'Wed 09 Jan 2008' .

传递的格式可以是预定义的格式之一 DATE_FORMATDATETIME_FORMATSHORT_DATE_FORMATSHORT_DATETIME_FORMAT 或使用上表中所示格式说明符的自定义格式。请注意,根据当前区域设置,预定义格式可能会有所不同。

假设 USE_L10NTrueLANGUAGE_CODE 例如, "es" ,然后::

{{ value|date:"SHORT_DATE_FORMAT" }}

输出将是字符串 "09/01/2008" (the "SHORT_DATE_FORMAT" 的格式说明符 es Django附带的区域设置为 "d/m/Y"

在没有格式字符串的情况下使用时, DATE_FORMAT 使用格式说明符。假设与上一个示例的设置相同:

{{ value|date }}

输出 9 de Enero de 2008 (the DATE_FORMAT 的格式说明符 es 区域设置是 r'j \d\e F \d\e Y' .

你可以结合 datetime 筛选以呈现 datetime 价值。例如。::

{{ value|date:"D d M Y" }} {{ value|time:"H:i" }}

default

如果值的计算结果为 False ,使用给定的默认值。否则,使用该值。

例如::

{{ value|default:"nothing" }}

如果 value"" (空字符串),输出将 nothing .

default_if_none

如果(且仅当)值为 None ,使用给定的默认值。否则,使用该值。

请注意,如果给定空字符串,则默认值将 not 被使用。使用 default 如果要回退为空字符串,则筛选。

例如::

{{ value|default_if_none:"nothing" }}

如果 valueNone ,输出为 nothing .

dictsort

获取字典列表并返回按参数中给定的键排序的列表。

例如::

{{ value|dictsort:"name" }}

如果 value 是:

[
    {'name': 'zed', 'age': 19},
    {'name': 'amy', 'age': 22},
    {'name': 'joe', 'age': 31},
]

那么输出将是:

[
    {'name': 'amy', 'age': 22},
    {'name': 'joe', 'age': 31},
    {'name': 'zed', 'age': 19},
]

你也可以做一些更复杂的事情,比如:

{% for book in books|dictsort:"author.age" %}
    * {{ book.title }} ({{ book.author.name }})
{% endfor %}

如果 books 是:

[
    {'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)

dictsort 还可以对列表列表(或任何其他实现对象)进行排序 __getitem__() )按指定索引处的元素。例如::

{{ value|dictsort:0 }}

如果 value 是:

[
    ('a', '42'),
    ('c', 'string'),
    ('b', 'foo'),
]

那么输出将是:

[
    ('a', '42'),
    ('b', 'foo'),
    ('c', 'string'),
]

必须以整数而不是字符串的形式传递索引。以下输出为空:

{{ values|dictsort:"0" }}

dictsortreversed

获取字典列表并返回该列表,该列表按参数中给定的键的相反顺序排序。这与上面的过滤器的工作原理完全相同,但返回的值将是相反的顺序。

divisibleby

返回 True 如果值可被参数整除。

例如::

{{ value|divisibleby:"3" }}

如果 value21 ,输出为 True .

escape

转义字符串的HTML。具体来说,它可以进行以下替换:

  • < is converted to &lt;
  • > is converted to &gt;
  • ' (single quote) is converted to &#39;
  • " (double quote) is converted to &quot;
  • & is converted to &amp;

应用 escape 对于通常对结果应用自动转义的变量,只会执行一轮转义。因此,即使在自动转义环境中也可以安全地使用此函数。如果要应用多个转义过程,请使用 force_escape 过滤器。

例如,您可以应用 escape 当字段为 autoescape 关闭::

{% autoescape off %}
    {{ title|escape }}
{% endautoescape %}

escapejs

转义字符以用于JavaScript字符串。这确实 not 使字符串在HTML或JavaScript模板文本中安全使用,但在使用模板生成javascript/json时,它可以防止语法错误。

例如::

{{ value|escapejs }}

如果 value"testing\r\njavascript \'string" <b>escaping</b>" ,输出为 "testing\\u000D\\u000Ajavascript \\u0027string\\u0022 \\u003Cb\\u003Eescaping\\u003C/b\\u003E" .

filesizeformat

将值格式化为“可读”文件大小(即 '13 KB''4.1 MB''102 bytes' 等)。

例如::

{{ value|filesizeformat }}

如果 value 是123456789,输出为 117.7 MB .

文件大小和国际单位

严格来说, filesizeformat 不符合国际单位制,当字节大小以1024次幂计算时,建议使用kib、mib、gib等。相反,django使用传统的单位名称(kb、mb、gb等),与更常用的名称相对应。

first

返回列表中的第一项。

例如::

{{ value|first }}

如果 value 是名单 ['a', 'b', 'c'] ,输出为 'a' .

floatformat

在没有参数的情况下使用时,将浮点数舍入到小数点后一位,但仅当要显示小数部分时。例如:

value 模板 产量
34.23234 {{ value|floatformat }} 34.2
34.00000 {{ value|floatformat }} 34
34.26000 {{ value|floatformat }} 34.3

如果与数字整数参数一起使用, floatformat 将一个数字舍入到小数点后那么多。例如:

value 模板 产量
34.23234 {{ value|floatformat:3 }} 34.232
34.00000 {{ value|floatformat:3 }} 34.000
34.26000 {{ value|floatformat:3 }} 34.260

特别有用的是将0(零)作为参数传递,该参数将浮点四舍五入为最接近的整数。

value 模板 产量
34.23234 {{ value|floatformat:"0" }} 34
34.00000 {{ value|floatformat:"0" }} 34
39.56000 {{ value|floatformat:"0" }} 40

如果参数传递给 floatformat 如果为负,它将把一个数字舍入到小数点后的那个位数——但只有在有小数部分要显示的情况下。例如:

value 模板 产量
34.23234 {{ value|floatformat:"-3" }} 34.232
34.00000 {{ value|floatformat:"-3" }} 34
34.26000 {{ value|floatformat:"-3" }} 34.260

使用 floatformat 没有参数等于使用 floatformat 与…争论 -1 .

force_escape

将HTML转义应用于字符串(请参见 escape 详细信息筛选)。已应用此筛选器 立即 并返回一个新的转义字符串。在需要多次转义或希望对转义结果应用其他筛选器的罕见情况下,这非常有用。通常,您要使用 escape 过滤器。

例如,如果要捕获 <p> 由创建的HTML元素 linebreaks 过滤器:

{% autoescape off %}
    {{ body|linebreaks|force_escape }}
{% endautoescape %}

get_digit

给定一个整数,返回请求的数字,其中1是最右边的数字,2是第二个最右边的数字,等等。返回无效输入的原始值(如果输入或参数不是整数,或者参数小于1)。否则,输出总是一个整数。

例如::

{{ value|get_digit:"2" }}

如果 value123456789 ,输出为 8 .

iriencode

将IRI(国际化资源标识符)转换为适合包含在URL中的字符串。如果您试图在URL中使用包含非ASCII字符的字符串,那么这是必需的。

在已经通过 urlencode 过滤器。

例如::

{{ value|iriencode }}

如果 value"?test=1&me=2" ,输出为 "?test=1&amp;me=2" .

join

用字符串联接列表,如python的 str.join(list)

例如::

{{ value|join:" // " }}

如果 value 是名单 ['a', 'b', 'c'] ,输出将是字符串 "a // b // c" .

json_script

安全地将python对象输出为json,包装在 <script> 标记,可用于JavaScript。

论点: 的HTML“ID” <script> 标签。

例如::

{{ value|json_script:"hello-data" }}

如果 value 是字典吗 {{'hello': 'world'}} ,输出为:

<script id="hello-data" type="application/json">{"hello": "world"}</script>

结果数据可以在javascript中访问,如下所示:

var value = JSON.parse(document.getElementById('hello-data').textContent);

通过转义字符“<”、“>”和“&”来减轻XSS攻击。例如,如果 value{{'hello': 'world</script>&amp;'}} ,输出为:

<script id="hello-data" type="application/json">{"hello": "world\\u003C/script\\u003E\\u0026amp;"}</script>

这与禁止页内脚本执行的严格内容安全策略兼容。它还保持了被动数据和可执行代码之间的清晰分离。

last

返回列表中的最后一项。

例如::

{{ value|last }}

如果 value 是名单 ['a', 'b', 'c', 'd'] ,输出将是字符串 "d" .

length

返回值的长度。这对字符串和列表都有效。

例如::

{{ value|length }}

如果 value['a', 'b', 'c', 'd']"abcd" ,输出为 4 .

过滤器返回 0 对于未定义的变量。

length_is

返回 True 如果值的长度是参数,或者 False 否则。

例如::

{{ value|length_is:"4" }}

如果 value['a', 'b', 'c', 'd']"abcd" ,输出为 True .

linebreaks

用适当的HTML替换纯文本中的换行符;单个换行符变为HTML换行符 (<br> )新的一行加上一个空行就变成了一个段落分隔符。 (</p>

例如::

{{ value|linebreaks }}

如果 valueJoel\nis a slug ,输出为 <p>Joel<br>is a slug</p> .

linebreaksbr

将一段纯文本中的所有换行符转换为HTML换行符 (<br>

例如::

{{ value|linebreaksbr }}

如果 valueJoel\nis a slug ,输出为 Joel<br>is a slug .

linenumbers

显示带行号的文本。

例如::

{{ value|linenumbers }}

如果 value 是::

one
two
three

输出将为:

1. one
2. two
3. three

ljust

左对齐给定宽度字段中的值。

论点: 字段大小

例如::

"{{ value|ljust:"10" }}"

如果 valueDjango ,输出为 "Django    " .

lower

将字符串转换为全部小写。

例如::

{{ value|lower }}

如果 valueTotally LOVING this Album! ,输出为 totally loving this album! .

make_list

返回转换为列表的值。对于字符串,它是一个字符列表。对于整数,在创建列表之前将参数强制转换为字符串。

例如::

{{ value|make_list }}

如果 value 是字符串 "Joel" ,输出将是列表 ['J', 'o', 'e', 'l'] .如果 value123 ,输出将是列表 ['1', '2', '3'] .

phone2numeric

将电话号码(可能包含字母)转换为等效的数字。

输入不一定是有效的电话号码。这将很高兴地转换任何字符串。

例如::

{{ value|phone2numeric }}

如果 value800-COLLECT ,输出为 800-2655328 .

pluralize

如果值不是1,则返回复数后缀。默认情况下,此后缀为 's' .

例子::

You have {{ num_messages }} message{{ num_messages|pluralize }}.

如果 num_messages is 1, the output will be You have 1 message. 如果 num_messages2 输出将是 You have 2 messages.

对于需要后缀而不是 's' ,您可以提供一个可选后缀作为过滤器的参数。

例子::

You have {{ num_walruses }} walrus{{ num_walruses|pluralize:"es" }}.

对于不以简单后缀复数的单词,可以同时指定单数和复数后缀,用逗号分隔。

例子::

You have {{ num_cherries }} cherr{{ num_cherries|pluralize:"y,ies" }}.

注解

使用 blocktrans 使翻译后的字符串复数。

pprint

包装纸 pprint.pprint() --是为了调试。

random

返回给定列表中的随机项。

例如::

{{ value|random }}

如果 value 是名单 ['a', 'b', 'c', 'd'] ,输出可以是 "b" .

rjust

右对齐给定宽度的字段中的值。

论点: 字段大小

例如::

"{{ value|rjust:"10" }}"

如果 valueDjango ,输出为 "    Django" .

safe

将字符串标记为在输出前不需要进一步的HTML转义。当自动转义关闭时,此筛选器没有效果。

注解

如果要链接筛选器,则在 safe 会使内容物再次不安全。例如,下面的代码按原样打印变量,而不是按范围打印:

{{ var|safe|escape }}

safeseq

适用于 safe 过滤到序列的每个元素。与对序列进行操作的其他筛选器(如 join . 例如::

{{ some_list|safeseq|join:", " }}

你不能用 safe 在这种情况下直接过滤,因为它首先将变量转换为字符串,而不是处理序列中的单个元素。

slice

返回列表切片。

使用与python的列表切片相同的语法。请参阅https://www.diveinto.org/python3/native datatypes.html slicinglists以获取介绍。

例子::

{{ some_list|slice:":2" }}

如果 some_list['a', 'b', 'c'] ,输出为 ['a', 'b'] .

slugify

转换为ASCII。将空格转换为连字符。删除不是字母数字、下划线或连字符的字符。转换为小写。同时去掉前导空格和尾随空格。

例如::

{{ value|slugify }}

如果 value"Joel is a slug" ,输出为 "joel-is-a-slug" .

stringformat

根据参数(字符串格式说明符)设置变量的格式。此说明符使用 printf-style String Formatting 语法,除去前导“%”。

例如::

{{ value|stringformat:"E" }}

如果 value10 ,输出为 1.000000E+01 .

striptags

尽一切可能剥去一切 [X] HTML标签。

例如::

{{ value|striptags }}

如果 value"<b>Joel</b> <button>is</button> a <span>slug</span>" ,输出为 "Joel is a slug" .

无安全保证

注意 striptags 不能保证输出是HTML安全的,特别是对于无效的HTML输入。所以 NEVER 应用 safe 过滤到 striptags 输出。如果您正在寻找更健壮的东西,可以使用 bleach python库,尤其是 clean 方法。

time

根据给定格式格式化时间。

给定的格式可以是预定义的格式 TIME_FORMAT 或自定义格式,与 date 过滤器。请注意,预定义的格式取决于区域设置。

例如::

{{ value|time:"H:i" }}

如果 value 等于 datetime.datetime.now() ,输出将是字符串 "01:23" .

另一个例子:

假设 USE_L10NTrueLANGUAGE_CODE 例如, "de" ,然后::

{{ value|time:"TIME_FORMAT" }}

输出将是字符串 "01:23" (The "TIME_FORMAT" 的格式说明符 de Django附带的区域设置为 "H:i"

这个 time 过滤器将只接受格式字符串中与一天中的时间相关的参数,而不接受日期(原因显而易见)。如果需要格式化 date 价值,使用 date 过滤(或沿 time 如果你需要呈现一个完整的 datetime 价值)。

上面的规则有一个例外:当通过 datetime 附加时区信息的值(A time-zone-aware datetime 实例) time 筛选器将接受与时区相关的 format specifiers 'e''O''T''Z' .

在没有格式字符串的情况下使用时, TIME_FORMAT 使用格式说明符::

{{ value|time }}

与以下内容相同:

{{ value|time:"TIME_FORMAT" }}

timesince

将日期格式设置为自该日期起的时间(例如,“4天,6小时”)。

接受一个可选参数,该参数是一个包含要用作比较点的日期的变量(没有该参数,比较点是 now )例如,如果 blog_date 是表示2006年6月1日午夜的日期实例,并且 comment_date 是2006年6月1日08:00的日期实例,则以下将返回“8小时”::

{{ blog_date|timesince:comment_date }}

比较offset naive和offset aware日期时间将返回空字符串。

分钟是使用的最小单位,对于将来相对于比较点的任何日期,都将返回“0分钟”。

timeuntil

类似 timesince 但它度量从现在到给定日期或日期时间的时间。例如,如果今天是2006年6月1日, conference_date 是2006年6月29日的日期实例,那么 {{{{ conference_date|timeuntil }}}} 将返回“4周”。

接受一个可选参数,该参数是一个包含要用作比较点的日期的变量(而不是 now )如果 from_date 包含2006年6月22日,则以下内容将返回“1周”::

{{ conference_date|timeuntil:from_date }}

比较offset naive和offset aware日期时间将返回空字符串。

分钟是使用的最小单位,对于过去相对于比较点的任何日期,都将返回“0分钟”。

title

通过使单词以大写字符开头,其余字符以小写字母开头,将字符串转换为标题库。这个标签不费吹灰之力地将“琐碎的单词”保持为小写。

例如::

{{ value|title }}

如果 value"my FIRST post" ,输出为 "My First Post" .

truncatechars

如果字符串长度超过指定的字符数,则截断该字符串。截断的字符串将以可翻译省略号字符(“…”)结尾。

论点: 要截断到的字符数

例如::

{{ value|truncatechars:7 }}

如果 value"Joel is a slug" ,输出为 "Joel i…" .

truncatechars_html

类似 truncatechars ,但它知道HTML标记。在字符串中打开但在截断点之前未关闭的所有标记在截断后立即关闭。

例如::

{{ value|truncatechars_html:7 }}

如果 value"<p>Joel is a slug</p>" ,输出为 "<p>Joel i…</p>" .

将保留HTML内容中的换行符。

truncatewords

在一定数量的单词后截断字符串。

论点: 后面要截断的字数

例如::

{{ value|truncatewords:2 }}

如果 value"Joel is a slug" ,输出为 "Joel is …" .

将删除字符串中的换行符。

truncatewords_html

类似 truncatewords ,但它知道HTML标记。在字符串中打开但在截断点之前未关闭的所有标记在截断之后立即关闭。

这比 truncatewords ,因此只能在传递HTML文本时使用。

例如::

{{ value|truncatewords_html:2 }}

如果 value"<p>Joel is a slug</p>" ,输出为 "<p>Joel is …</p>" .

将保留HTML内容中的换行符。

unordered_list

递归获取一个自嵌套的列表并返回一个HTML无序列表——不打开和关闭<ul>标记。

假设列表的格式正确。例如,如果 var 包含 ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']] 然后 {{{{ var|unordered_list }}}} 将返回:

<li>States
<ul>
        <li>Kansas
        <ul>
                <li>Lawrence</li>
                <li>Topeka</li>
        </ul>
        </li>
        <li>Illinois</li>
</ul>
</li>

upper

将字符串转换为全部大写。

例如::

{{ value|upper }}

如果 value"Joel is a slug" ,输出为 "JOEL IS A SLUG" .

urlencode

转义一个值以在URL中使用。

例如::

{{ value|urlencode }}

如果 value"https://www.example.org/foo?a=b&c=d" ,输出为 "https%3A//www.example.org/foo%3Fa%3Db%26c%3Dd" .

可以提供包含不应转义的字符的可选参数。

如果未提供,则假定“/”字符是安全的。在以下情况下可以提供空字符串: all 应转义字符。例如::

{{ value|urlencode:"" }}

如果 value"https://www.example.org/" ,输出为 "https%3A%2F%2Fwww.example.org%2F" .

urlize

将文本中的URL和电子邮件地址转换为可单击的链接。

此模板标记用于前缀为的链接 http://https://www. . 例如, https://goo.gl/aia1t 将被转换,但 goo.gl/aia1t 不会。

它还支持以原始顶级域之一结尾的仅域链接 (.com.edu.gov.int.mil.net.org )例如, djangoproject.com 转换。

链接可以有尾随标点(句点、逗号、右括号)和前导标点(左括号),以及 urlize 仍然会做正确的事情。

链接生成者 urlize 有一个 rel="nofollow" 属性添加到它们。

例如::

{{ value|urlize }}

如果 value"Check out www.djangoproject.com" ,输出为 "Check out <a href="http://www.djangoproject.com" rel="nofollow">www.djangoproject.com</a>" .

除了网络链接外, urlize 同时将电子邮件地址转换为 mailto: 链接。如果 value"Send questions to foo@example.com" ,输出为 "Send questions to <a href="mailto:foo@example.com">foo@example.com</a>" .

这个 urlize 过滤器还接受可选参数 autoescape .如果 autoescapeTrue ,链接文本和URL将使用Django内置的 escape 过滤器。的默认值 autoescapeTrue .

注解

如果 urlize 应用于已包含HTML标记的文本,将无法按预期工作。仅对纯文本应用此筛选器。

urlizetrunc

将URL和电子邮件地址转换为可单击的链接,就像 urlize, 但截断的URL长度超过了给定的字符限制。

论点: 链接文本应截断到的字符数,包括在需要截断时添加的省略号。

例如::

{{ value|urlizetrunc:15 }}

如果 value"Check out www.djangoproject.com" ,输出为 'Check out <a href="http://www.djangoproject.com" rel="nofollow">www.djangoproj…</a>' .

和一样 urlize, 此筛选器只能应用于纯文本。

wordcount

返回字数。

例如::

{{ value|wordcount }}

如果 value"Joel is a slug" ,输出为 4 .

wordwrap

以指定的行长度换行。

论点: 文本换行的字符数

例如::

{{ value|wordwrap:5 }}

如果 valueJoel is a slug 输出为:

Joel
is a
slug

yesno

映射值 TrueFalse 和(可选) None ,返回字符串“yes”、“no”、“maybe”或作为逗号分隔列表传递的自定义映射,并根据值返回这些字符串之一:

例如::

{{ value|yesno:"yeah,no,maybe" }}
价值 论证 输出
True   yes
True "yeah,no,maybe" yeah
False "yeah,no,maybe" no
None "yeah,no,maybe" maybe
None "yeah,no" no (皈依者) NoneFalse 如果没有映射 None 给出)

国际化标记和过滤器

Django提供了模板标签和过滤器来控制 internationalization 在模板中。它们允许对翻译、格式化和时区转换进行粒度控制。

i18n

此库允许在模板中指定可翻译文本。要启用它,请设置 USE_I18NTrue ,然后加载 {{% load i18n %}} .

国际化:在模板代码中 .

l10n

此库提供对模板中值本地化的控制。您只需要使用 {{% load l10n %}} 但是你经常会 USE_L10NTrue 使本地化在默认情况下处于活动状态。

控制模板中的本地化 .

tz

此库提供对模板中时区转换的控制。喜欢 l10n ,您只需要使用 {{% load tz %}} 但是你通常也会 USE_TZTrue 所以默认情况下转换为本地时间。

模板中的时区感知输出 .

其他标记和筛选器库

Django附带了一些其他模板标记库,您必须在 INSTALLED_APPS 在模板中设置和启用 {{% load %}} 标签。

django.contrib.humanize

一组Django模板过滤器,用于向数据添加“人工触摸”。见 django.contrib.humanize .

static

static

链接到保存在 STATIC_ROOT Django与 static 模板标签。如果 django.contrib.staticfiles 应用程序已安装,标签将使用 url() 由指定的存储方法 STATICFILES_STORAGE . 例如::

{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!">

它还能够使用标准上下文变量,例如假设 user_stylesheet 变量传递到模板:

{% load static %}
<link rel="stylesheet" href="{% static user_stylesheet %}" type="text/css" media="screen">

如果要检索静态URL而不显示它,可以使用稍微不同的调用::

{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}">

使用jinja2模板?

Jinja2 有关使用的信息 static 用金贾2标记。

get_static_prefix

你应该更喜欢 static 模板标记,但如果您需要更精确地控制位置和方式 STATIC_URL 注入到模板中,可以使用 get_static_prefix 模板标签:

{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!">

如果您多次需要该值,还可以使用第二个表单来避免额外的处理:

{% load static %}
{% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!">
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!">

get_media_prefix

类似于 get_static_prefixget_media_prefix 用媒体前缀填充模板变量 MEDIA_URL ,例如:

{% load static %}
<body data-media-url="{% get_media_prefix %}">

通过将值存储在一个数据属性中,我们可以确保如果我们想在JavaScript上下文中使用它,可以对其进行适当的转义。