Skip to main content

内置模板标签和过滤器

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

内置标签引用

autoescape

控制当前自动转义行为。此标记采用 onoff 作为参数,并确定块中是否有自动转义。该块用 endautoescape 结束标签关闭。

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

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

示例用法:

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

block

定义可以由子模板覆盖的块。有关详细信息,请参阅 模板继承

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保护,如 跨站点请求伪造 文档中所述。

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> 元素的列表,其中 classrow1row2 之间交替。子模板将在其上下文中访问 rowcolors,并且该值将匹配包围它的 <tr> 的类。如果要省略 silent 关键字,row1row2 将作为正常文本在 <tr> 元素之外发出。

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

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

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" %}
New in Django 1.10:

添加了使用相对路径的能力。

filter

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

注意,该块包括 allfilterendfilter 标签之间的文本。

示例用法:

{% 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 %} 将输出存储在变量中。

New in Django 1.9:

添加了“as”语法。

for

循环遍历数组中的每个项目,使该项目在上下文变量中可用。例如,显示 athlete_list 中提供的运动员的列表:

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

您可以使用 {% for obj in list reversed %} 反向循环列表。

如果需要循环列表列表,则可以将每个子列表中的值解包为单个变量。例如,如果上下文包含称为 points 的(x,y)坐标列表,则可以使用以下方式输出点列表:

{% 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 等)中使用这些方法,请避免添加名为字典方法的键。阅读更多关于 模板变量的文档 中点运算符的查找顺序。

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

变量

描述

forloop.counter

循环的当前迭代(1索引)

forloop.counter0

循环的当前迭代(0索引)

forloop.revcounter

从循环结束的迭代次数(1-indexed)

forloop.revcounter0

从循环结束的迭代次数(0索引)

forloop.first

如果这是第一次通过循环,则为true

forloop.last

如果这是最后一次通过循环,则为true

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 运算符
New in Django 1.10.

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

{% 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 运算符
New in Django 1.10.

否定对象标识。测试两个值是否不是同一个对象。这是 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 %}

ifequalifnotequal

{% 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 标记中所述。

New in Django 1.10:

添加了使用相对路径的能力。

此示例包括其名称包含在变量 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 %}

如果包含的模板在渲染(包括如果丢失或有语法错误)时引起异常,则行为会根据 template engine's debug 选项(如果未设置,则此选项默认为 DEBUG 的值)而有所不同。当调试模式打开时,将引发 TemplateDoesNotExistTemplateSyntaxError 等异常。当调试模式关闭时,{% include %} 会向 django.template 记录器记录一个警告,但在呈现包含的模板时会发生异常,并返回一个空字符串。

Changed in Django 1.9:

模板日志记录现在包括上面提到的警告日志。

注解

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

块被评估它们被包括的 before。这意味着包括来自另一个块的块的模板将包含具有 已经被评估和呈现 的块 - 不是可以被例如扩展模板覆盖的块。

load

加载自定义模板标记集。

例如,以下模板将加载在位于包 package 中的 somelibraryotherlibrary 中注册的所有标记和过滤器:

{% load somelibrary package.otherlibrary %}

您还可以使用 from 参数从库选择性加载单个过滤器或标记。在本示例中,将从 somelibrary 加载名为 foobar 的模板标签/过滤器:

{% load foo bar from somelibrary %}

有关详细信息,请参阅 自定义标记和过滤器库

lorem

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

用法:

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

{% lorem %} 标签可以使用零个,一个,两个或三个参数。参数是:

论据

描述

count

包含要生成的段落或单词数量的数字(或变量)(默认值为1)。

method

单词的 w,HTML段落的 p 或纯文本段落的 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" %}

注意,如果要使用“raw”值,可以反斜杠转义格式字符串。在此示例中,“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 %} 将输出(作为字符串)存储在变量中。如果您想在模板标签(例如 blocktrans)中使用 {% now %},这将非常有用:

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

...并且您想显示按国家/地区排序的分层列表,如下所示:

  • 印度

    • 孟买: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 %} 有三个参数:要重新组合的列表,分组的属性,以及结果列表的名称。在这里,我们通过 country 属性重新分组 cities 列表,并调用结果 country_list

{% regroup %} 产生 组对象 的列表(在这种情况下,country_list)。每个组对象有两个属性:

  • grouper - 按分组的项目(例如,字符串“India”或“Japan”)。

  • list - 此群组中所有项目的列表(例如,所有城市的列表,其中country =’India’)。

请注意,{% 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 %} 模板代码将导致以下输出:

  • 印度

    • 孟买:19,000,000

  • 美国

    • 纽约:20,000,000

  • 印度

    • 加尔各答:15,000,000

  • 美国

    • 芝加哥:7,000,000

  • 日本

    • 东京:33,000,000

这个问题的最简单的解决方案是确保在您的视图代码中,数据是根据您想要显示的顺序排序。

另一个解决方案是使用 dictsort 过滤器对模板中的数据进行排序,如果您的数据在字典列表中:

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

对其他属性分组

任何有效的模板查找都是regroup标记的合法分组属性,包括方法,属性,字典键和列表项。例如,如果“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 集合的值字段,而不是键。

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

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

这是一种输出链接而不违反DRY原则的方法,因为必须对模板中的URL进行硬编码:

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

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

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

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

例如,假设您有一个视图 app_views.client,其URLconf接受客户端ID(这里,client() 是视图文件 app_views.py 中的一个方法)。 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/

请注意,如果您要撤消的网址不存在,您会收到 NoReverseMatch 异常,这将导致您的网站显示错误页面。

如果您希望在不显示网址的情况下检索网址,则可以使用略有不同的调用:

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

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

as var 语法创建的变量的范围是出现 {% url %} 标记的 {% block %}

如果视图丢失,此 {% 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 'myapp:view-name' %}

这将遵循正常的 命名空间的URL解析策略,包括使用由当前应用程序的上下文提供的任何提示。

警告

不要忘记在 url() name 周围添加引号,否则该值将被解释为上下文变量!

verbatim

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

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

{% 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 = .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兼容,以便为设计者轻松过渡。

可用的格式字符串:

格式字符

描述

示例输出

a

'a.m.''p.m.' (请注意,这与PHP输出略有不同,因为这包括与Associated Press样式匹配的句点。)

'a.m.'

A

'AM''PM'

'AM'

b

月,文字,3个字母,小写。

'jan'

B

未实现。

 

c

ISO 8601格式。 (注意:与其他格式化程序,如“Z”,“O”或“r”不同,如果值是一个天真的datetime(见 datetime.tzinfo),“c”格式化程序不会添加时区偏移。

2008-01-02T10:30:00.000123+02:002008-01-02T10:30:00.000123 (如果datetime是天真的)

d

月的日期,带前导零的2位数字。

'01''31'

D

星期几,文字,3个字母。

'Fri'

e

时区名称。可以是任何格式,或可能返回一个空字符串,具体取决于datetime。

'''GMT''-500''US/Eastern' 等。

E

月,特定于语言环境的替代表示,通常用于长日期表示。

'listopada' (对于波兰语区域,而不是 'Listopad'

f

时间,12小时小时和分钟,如果他们为零,分钟将关闭。专有扩展。

'1''1:30'

F

月,文字,长。

'January'

g

小时,12小时格式,不含前导零。

'1''12'

G

小时,24小时格式,无前导零。

'0''23'

h

小时,12小时格式。

'01''12'

H

小时,24小时格式。

'00''23'

i

分钟。

'00''59'

I

夏令时,无论是否生效。

'1''0'

j

没有前导零的月份日。

'1''31'

l

星期几,文字,长。

'Friday'

L

是否为闰年的布尔值。

TrueFalse

m

月,2位数字,前导零。

'01''12'

M

月,文字,3个字母。

'Jan'

n

没有前导零的月。

'1''12'

N

月缩写在Associated Press风格。专有扩展。

'Jan.''Feb.''March''May'

o

ISO-8601周编号年,对应于使用闰年的ISO-8601周编号(W)。更常见的年份格式见Y。

'1999'

O

与格林威治时间的差值(以小时为单位)。

'+0200'

P

时间,12小时制,分钟和’a.m。’/’p.m。’,如果它们为零,分钟将关闭,如果合适,分钟将保留特殊字符串’午夜’和’中午’。专有扩展。

'1 a.m.''1:30 p.m.''midnight''noon''12:30 p.m.'

r

RFC 5322 格式的日期。

'Thu, 21 Dec 2000 16:01:07 +0200'

s

秒,带前导零的2位数。

'00''59'

S

每月日期的英文序数后缀,2个字符。

'st''nd''rd''th'

t

指定月份的天数。

2831

T

本机的时区。

'EST''MDT'

u

微秒。

000000999999

U

自Unix时代以来的秒数(1970年1月1日00:00:00 UTC)。

 

w

星期几,没有前导零的数字。

'0' (星期日)至 '6' (星期六)

W

ISO-8601年的周数,周从星期一开始。

153

y

年,2位数。

'99'

Y

年,4位数。

'1999'

z

一年中的一天。

0365

Z

时区偏移(以秒为单位)。 UTC之前的时区的偏移总是负的,并且对于UTC的东部的偏移总是正的。

-4320043200

例如:

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

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

传递的格式可以是预定义的 DATE_FORMATDATETIME_FORMATSHORT_DATE_FORMATSHORT_DATETIME_FORMAT 之一,也可以是使用上表中显示的格式说明符的自定义格式。请注意,预定义的格式可能会根据当前语言环境而有所不同。

假设 USE_L10NTrueLANGUAGE_CODE 是例如 "es",则for:

{{ value|date:"SHORT_DATE_FORMAT" }}

输出将是字符串 "09/01/2008" (与Django一起提供的 es 语言环境的 "SHORT_DATE_FORMAT" 格式说明符是 "d/m/Y")。

不使用格式字符串时使用:

{{ value|date }}

...将使用 DATE_FORMAT 设置中定义的格式化字符串,而不应用任何本地化。

您可以将 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" }}
Changed in Django 1.10:

添加了订购列表列表的功能。

dictsortreversed

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

divisibleby

如果值可由参数整除,则返回 True

例如:

{{ value|divisibleby:"3" }}

如果 value21,输出将是 True

escape

转义字符串的HTML。具体来说,它使这些替换:

  • < 转换为 &lt;

  • > 转换为 &gt;

  • ' (单引号)转换为 &#39;

  • " (双引号)转换为 &quot;

  • & 转换为 &amp;

转义仅在输出字符串时应用,因此在 escape 的过滤器的链接序列中的哪个位置无关紧要:它将始终应用,就像它是最后一个过滤器。如果要立即应用转义,请使用 force_escape 过滤器。

escape 应用于通常将自动转义应用于结果的变量只会导致完成一轮转义。因此,即使在自动逃逸环境中使用此功能也是安全的。如果要应用多个转义通过,请使用 force_escape 过滤器。

例如,您可以在 autoescape 关闭时将 escape 应用于字段:

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

1.10 版后已移除: escape 过滤器的“延迟”行为已被弃用。它会改变为立即在Django 2.0中应用 conditional_escape()

escapejs

转义用于JavaScript字符串的字符。这使 not 使字符串安全用于HTML,但确保保护您免受使用模板生成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

文件大小和SI单位

严格地说,filesizeformat 不符合国际单位制度,其建议使用KiB,MiB,GiB等,当字节大小以1024的幂(这是这里的情况)计算时。相反,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(零)作为参数,它将使float浮动到最接近的整数。

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 等同于使用具有 -1 参数的 floatformat

force_escape

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

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

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

get_digit

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

例如:

{{ value|get_digit:"2" }}

如果 value123456789,输出将是 8

iriencode

将IRI(国际化资源标识符)转换为适合包含在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"

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

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

例如:

{{ 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_messages1,则输出将是 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列表切片相同的语法。有关介绍,请参阅 http://www.diveintopython3.net/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输入。因此 决不safe 滤波器应用于 striptags 输出。如果你正在寻找更强大的东西,你可以使用 bleach Python库,特别是它的 clean 方法。

time

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

给定格式可以是预定义的一个 TIME_FORMAT,或自定义格式,与 date 过滤器相同。请注意,预定义的格式是与区域设置相关的。

例如:

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

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

另一个例子:

假设 USE_L10NTrueLANGUAGE_CODE 是例如 "de",则for:

{{ value|time:"TIME_FORMAT" }}

输出将是字符串 "01:23:00" (与Django一起提供的 de 语言环境的 "TIME_FORMAT" 格式说明符是 "H:i:s")。

time 过滤器只接受格式字符串中与时间相关的参数,而不是日期(由于显而易见的原因)。如果您需要格式化 date 值,请改用 date 滤镜(如果您需要渲染完整的 datetime 值,请按 time)。

以上规则有一个例外:当传递带有附加时区信息(时区感知 datetime 实例)的 datetime 值时,time 过滤器将接受与时区相关的 格式说明符 'e''O''T''Z'

不使用格式字符串时使用:

{{ 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:9 }}

如果 value"Joel is a slug",输出将是 "Joel i..."

truncatechars_html

类似于 truncatechars,除了它知道HTML标签。在字符串中打开并且在截断点之前未关闭的任何标记在截断后立即关闭。

例如:

{{ value|truncatechars_html:9 }}

如果 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

将文字中的网址和电子邮件地址转换为可点击的链接。

此模板标记适用于以 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 过滤器转义。 autoescape 的默认值为 True

注解

如果 urlize 应用于已经包含HTML标记的文本,则会无法正常工作。仅将此过滤器应用于纯文本。

urlizetrunc

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

论据: 链接文本的字符数应截短为,包括在必要截断时添加的省略号。

例如:

{{ value|urlizetrunc:15 }}

如果 value"Check out www.djangoproject.com",输出将是 'Check out <a href="http://www.djangoproject.com" rel="nofollow">www.djangopr...</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 (如果没有给出 None 的映射,则将 None 转换为 False

国际化标签和过滤器

Django提供了模板标签和过滤器来控制模板中 国际化 的每个方面。它们允许对翻译,格式化和时区转换进行粒度控制。

i18n

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

国际化:在模板代码中

l10n

此库提供对模板中值的本地化的控制。您只需要使用 {% load l10n %} 加载库,但您通常将 USE_L10N 设置为 True,以便本地化在默认情况下处于活动状态。

控制模板中的本地化

tz

此库提供对模板中的时区转换的控制。像 l10n,你只需要使用 {% load tz %} 加载库,但通常还会将 USE_TZ 设置为 True,以便默认转换为本地时间。

模板中的时区感知输出

其他标签和过滤器库

Django附带了几个其他模板标签库,您必须在您的 INSTALLED_APPS 设置中显式启用,并在您的模板中使用 {% load %} 标签启用。

django.contrib.humanize

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

static

static

要链接到保存在 STATIC_ROOT 中的静态文件Django附带一个 static 模板标签。如果安装了 django.contrib.staticfiles 应用程序,则标记将使用 STATICFILES_STORAGE 指定的存储的 url() 方法提供文件。例如:

{% 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" />

如果您希望在不显示静态网址的情况下检索静态网址,则可以使用略有不同的调用:

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

使用Jinja2模板?

有关使用Jinja2使用 static 标签的信息,请参阅 Jinja2

Changed in Django 1.10:

在旧版本中,您必须在模板中使用 {% load static from staticfiles %}STATICFILES_STORAGE 中定义的存储中提供文件。这不再需要。

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

通过将值存储在data属性中,如果我们想在JavaScript上下文中使用它,我们确保它适当地转义。