内置模板标签和过滤器

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

内置标签参考

autoescape

控制当前的自动转义行为。 该标签将或off上的on 该块用endautoescape结尾标签关闭。

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

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

示例用法:

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

block

定义可以被子模板覆盖的块。 有关更多信息,请参见Template inheritance

comment

Ignores everything between {% comment %} and {% 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等等。循环。

你也可以使用变量。 For example, if you have two template variables, rowvalue1 and rowvalue2, you can alternate between their values like this:

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

在某些情况下,您可能想引用一个循环的当前值而不会前进到下一个值。 要做到这一点,只需要使用“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关键字作为循环标记时,{% 循环 %} 启动循环会自行产生循环中的第一个值。 这可能是一个问题,如果你想使用嵌套循环或包含的模板中的值。 如果您只想声明周期但不产生第一个值,则可以在标记中添加一个silent关键字作为最后一个关键字。 例如:

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

这将输出classrow1row2之间交替的<tr>元素的列表。 子模板将在其上下文中访问rowcolors,并且该值将匹配包含它的<tr>的类。 如果省略silent关键字,那么row1row2将作为普通文本发送到<tr>

在循环定义中使用silent关键字时,该沉默自动应用于该特定循环标记的所有后续使用。 The following template would output nothing, even though the second call to {% cycle %} doesn’t specify silent:

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

您可以使用resetcycle标记来制作{% 周期 %}标记下次遇到时,从第一个值重新开始。

debug

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

extends

表示该模板扩展了父模板。

这个标签可以用两种方式使用:

  • {% 扩展 “base.html” %}字面值"base.html"作为要扩展的父模板的名称。
  • {% extends variable %} uses the value of variable. 如果变量的计算结果为字符串,Django将使用该字符串作为父模板的名称。 如果变量的计算结果是一个Template对象,Django将使用该对象作为父模板。

有关更多信息,请参见Template inheritance

通常,模板名称是相对于模板加载程序的根目录。 字符串参数也可以是以./../开头的相对路径。 例如,假设以下目录结构:

dir1/
    template.html
    base2.html
    my/
        base3.html
base1.html

template.html中,以下路径是有效的:

{% extends "./base2.html" %}
{% extends "../base1.html" %}
{% extends "./my/base3.html" %}

filter

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

请注意,该块包含全部 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 %}

You can use the syntax {% firstof var1 var2 var3 as value %} to store the output inside a variable.

for

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

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

您可以通过在 tt> 列表中使用{% obj tt> 反转 tt> %}

如果您需要遍历列表的列表,则可以将每个子列表中的值解包为单个变量。 例如,如果您的上下文包含名为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 %}

请记住,对于点运算符,字典键查找优先于方法查找。 Therefore if the data dictionary contains a key named 'items', data.items will return data['items'] instead of 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标签可以采用可选的{% %}如果给定的数组为空或无法找到,则显示:

<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

The {% if %} tag evaluates a variable, and if that variable is “true” (i.e. exists, is not empty, and is not a false boolean value) the contents of the block are output:

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

In the above, if athlete_list is not empty, the number of athletes will be displayed by the {{ athlete_list|length }} variable.

As you can see, the if tag may take one or several {% elif %} clauses, as well as an {% else %} clause that will be displayed if all previous conditions fail. 这些条款是可选的。

布尔运算符

if tags may use and, or or not to test a number of variables or to negate a given variable:

{% 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 tags may also use the operators ==, !=, <, >, <=, >=, in, not in, is, and is not which work as follows:

==运算符

平等。 例:

{% 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容器支持,以测试给定的值是否在容器中。 The following are some examples of how x in y will be interpreted:

{% 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 %}
不是 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运算符的否定。 例:

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

过滤器¶ T0>

您也可以在if表达式中使用过滤器。 例如:

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

复杂表达式

以上所有可以组合起来形成复杂的表达式。 对于这样的表达式,在评估表达式时知道操作符是如何分组的 - 也就是优先规则是很重要的。 从最低到最高,运营商的优先级如下:

  • 要么
  • ==, !=, <, >, <=, >=

(这完全遵循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 %} 是一种过时的写作方式 {% 如果 a == b %} ... {% 万一 %}. 同样, {% ifnotequal a b %} ... {% endifnotequal %} 被取代 {% 如果 a != b %} ... {% 万一 %}. The ifequal and ifnotequal tags will be deprecated in a future release.

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

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

自1.11版以来已弃用: 在渲染{% 包含 %}模板标记时引发的异常异常已被取消。 在Django 2.1中,将会引发异常。

注意

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

包含在之前的块被评估 This means that a template that includes blocks from another will contain blocks that have already been evaluated and rendered - not blocks that can be overridden by, for example, an extending template.

load

加载自定义模板标记集。

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

{% 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 %}标签可以与零个,一个,两个或三个参数一起使用。 参数是:

论据 描述
计数 包含要生成的段落或单词数量的数字(或变量)(默认值为1)。
方法 对于HTML段落,w,对于明文段落块,pb(默认为b) 。
随机 如果给出的话,random这个词不会在生成文本时使用常见的段落(“Lorem ipsum dolor sit amet ...”)。

例子:

  • {% lorem %}会输出常见的“lorem ipsum”段落。
  • {% lorem 3 p %} will output the common “lorem ipsum” paragraph and two random paragraphs each wrapped in HTML <p> tags.
  • {% lorem 2 w random %} will output two random Latin words.

now

显示当前日期和/或时间,使用根据给定字符串的格式。 这样的字符串可以包含date过滤器部分中描述的格式说明符字符。

例:

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

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

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

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

注意

The format passed can also be one of the predefined ones DATE_FORMAT, DATETIME_FORMAT, SHORT_DATE_FORMAT or SHORT_DATETIME_FORMAT. 预定义的格式可能会根据当前语言环境而变化,如果Format localization已启用,例如:

It is {% now "SHORT_DATETIME_FORMAT" %}

You can also use the syntax {% now "Y" as current_year %} to store the output (as a string) inside a variable. This is useful if you want to use {% now %} inside a template tag like blocktrans for example:

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

regroup

用一个共同的属性重新组合一个类似的对象列表。

This complex tag is best illustrated by way of an example: say that cities is a list of cities represented by dictionaries containing "name", "population", and "country" keys:

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
    • 芝加哥:700万
  • 日本
    • 东京: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 %} takes three arguments: the list you want to regroup, the attribute to group by, and the name of the resulting list. Here, we’re regrouping the cities list by the country attribute and calling the result country_list.

{% regroup %} produces a list (in this case, country_list) of group objects. 组对象是带有两个字段的namedtuple()的实例:

  • grouper – the item that was grouped by (e.g., the string “India” or “Japan”).
  • list - 该组中所有项目的列表(例如,所有国家=“印度”的城市列表)。
在Django 1.11中更改:

组对象已从字典更改为namedtuple()

Because {% regroup %} produces namedtuple() objects, you can also write the previous example as:

{% 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排序的事实。 If the cities list did not order its members by country, the regrouping would naively display more than one group for a single 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
  • 美国
    • 芝加哥:700万
  • 日本
    • 东京:33,000,000

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

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

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

在其他属性上分组

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

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

或者,如果countrychoices的字段,则将有一个可用作属性的get_FOO_display()方法,显示字符串而不是choices键:

{% regroup cities by get_country_display as country_list %}

{{ country.grouper }} will now display the value fields from the choices set rather than the keys.

resetcycle

Django 1.11新增功能

重置前一个周期,以便在下次遇到时从第一个项目重新开始。 Without arguments, {% resetcycle %} will reset the last {% cycle %} defined in the template.

用法示例:

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

只有标签之间的空格被移除 - 标签和文本之间没有空格。 在这个例子中,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)。 Any special characters in the resulting path will be encoded using iri_to_uri().

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

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

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

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

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

For example, suppose you have a view, app_views.client, whose URLconf takes a client ID (here, client() is a method inside the views file 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/

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

如果您想检索网址而不显示网址,则可以使用稍微不同的呼叫:

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

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

The scope of the variable created by the as var syntax is the {% block %} in which the {% url %} tag appears.

这个 {% 网址 ... VAR %} 语法将如果视图丢失会导致错误。 在实践中,您将使用它链接到可选的视图:

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

The populated variable (in the example above, total) is only available between the {% with %} and {% endwith %} tags.

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

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

注意

The previous more verbose format is still supported: {% with business.employees.count as total %}

内置过滤器参考

add

将参数添加到值。

例如:

{{ value|add:"2" }}

如果value4,那么输出将是6

这个过滤器将首先尝试将这两个值强制为整数。 如果失败,它会尝试将值加在一起。 这将适用于某些数据类型(字符串,列表等),并在其他数据类型上失败。 如果失败,结果将是一个空字符串。

例如,如果我们有:

{{ first|add:second }}

and first is [1, 2, 3] and second is [4, 5, 6], then the output will be [1, 2, 3, 4, 5, 6].

警告

Strings that can be coerced to integers will be summed, not concatenated, as in the first example above.

addslashes

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

例如:

{{ value|addslashes }}

If value is "I'm using Django", the output will be "I\'m using Django".

capfirst

将值的第一个字符大写。 如果第一个字符不是字母,则此过滤器不起作用。

例如:

{{ value|capfirst }}

如果value"django",则输出将是"Django"

center

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

例如:

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

如果value"Django",则输出将是 Django T7> T4>。

cut

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

例如:

{{ value|cut:" " }}

If value is "String with spaces", the output will be "Stringwithspaces".

date

根据给定的格式格式化一个日期。

使用与PHP的date()函数(https://php.net/date)类似的格式,但有一些不同之处。

注意

这些格式字符不在Django模板之外使用。 他们被设计为与PHP兼容,以缓解设计师的过渡。

Available format strings:

格式字符 描述 输出示例
a 'a.m.' or 'p.m.' (Note that this is slightly different than PHP’s output, because this includes periods to match Associated Press style.) '上午。'
A 'AM' or 'PM'. '上午'
b 月份,文字,3个字母,小写。 “扬”
B 未实现。  
c ISO 8601格式。 (Note: unlike others formatters, such as “Z”, “O” or “r”, the “c” formatter will not add timezone offset if value is a naive datetime (see datetime.tzinfo). 2008-01-02T10:30:00.000123+02:00, or 2008-01-02T10:30:00.000123 if the datetime is naive
d 月份的日期,2位数字前导零。 '01''31'
D 星期几,文字,3个字母。 “星期五”
e 时区名称。 可能是任何格式,或者可能会返回一个空字符串,具体取决于日期时间。 '', 'GMT', '-500', 'US/Eastern', etc.
E 月,通常用于长日期表示的区域特定替代表示。 'listopada'(对于波兰语区域,与'Listopad'相对)
f 时间在12小时和分钟之内,如果它们为零,则停止分钟。 专有扩展。 '1''1:30'
F 月份,文字,长。 '一月'
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 星期几,文字,长。 '星期五'
L 布尔是否是闰年。 TrueFalse
m 月份,2位数字前导零。 '01''12'
M 月,文字,3个字母。 “扬”
n 月没有前导零。 '1''12'
N 美联社风格的月份缩写。 专有扩展。 'Jan.''Feb.''March''May'
o ISO-8601星期编号年,对应于使用闰周的ISO-8601星期编号(W)。 请参阅Y,了解更常见的年份格式。 '1999年'
O 格林尼治时间与小时之差。 '+0200'
P 时间为12小时,分钟和'上午/下午',如果它们为零,并且特殊情况下的字符串为“午夜”和“中午”(如果适当的话),则分钟不变。 专有扩展。 '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 给定月份的天数。 28 to 31
T 这台机器的时区。 'EST''MDT'
u 微秒。 000000999999
U 自Unix时代开始(1970年1月1日00:00:00 UTC)。  
w 一周中的一天,没有前导零的数字。 '0'(星期天)至'6'(星期六)
W ISO-8601周数,星期一开始。 1, 53
y 年,2位数字。 '99'
Y 年,4位数字。 '1999年'
z 一年中的一天。 0 to 365
Z 以秒为单位的时区偏移量。 UTC以西的时差偏移总是负的,而UTC以东的偏移总是正的。 -4320043200

例如:

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

If value is a datetime object (e.g., the result of datetime.datetime.now()), the output will be the string 'Wed 09 Jan 2008'.

The format passed can be one of the predefined ones DATE_FORMAT, DATETIME_FORMAT, SHORT_DATE_FORMAT or SHORT_DATETIME_FORMAT, or a custom format that uses the format specifiers shown in the table above. 请注意,预定义的格式可能会因当前的区域设置而异。

假设USE_L10NTrueLANGUAGE_CODE为例如"es"

{{ value|date:"SHORT_DATE_FORMAT" }}

输出将是字符串"09/01/2008"(Django附带的es语言环境的"SHORT_DATE_FORMAT"格式说明符是"d/m/Y"

当使用没有格式字符串时,使用DATE_FORMAT格式说明符。 假设与前面的例子相同的设置:

{{ value|date }}

outputs 9 de Enero de 2008 (the DATE_FORMAT format specifier for the es locale is r'j \d\e F \d\e Y'.

You can combine date with the time filter to render a full representation of a datetime value. 例如。:

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

default

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

例如:

{{ value|default:"nothing" }}

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

default_if_none

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

请注意,如果给出了一个空字符串,默认值将会使用不是 如果您想回退空字符串,请使用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 can also order a list of lists (or any other object implementing __getitem__()) by elements at specified index. 例如:

{{ 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。 具体而言,它使这些替代品:

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

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

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

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

escapejs

转义用于JavaScript字符串的字符。 This does not make the string safe for use in HTML, but does protect you from syntax errors when using templates to generate JavaScript/JSON.

例如:

{{ value|escapejs }}

If value is "testing\r\njavascript \'string" <b>escaping</b>", the output will be "testing\\u000D\\u000Ajavascript \\u0027string\\u0022 \\u003Cb\\u003Eescaping\\u003C/b\\u003E".

filesizeformat

Formats the value like a ‘human-readable’ file size (i.e. '13 KB', '4.1 MB', '102 bytes', etc.).

例如:

{{ value|filesizeformat }}

如果value是123456789,则输出将是117.7 MB

文件大小和SI单位

Strictly speaking, filesizeformat does not conform to the International System of Units which recommends using KiB, MiB, GiB, etc. when byte sizes are calculated in powers of 1024 (which is the case here). 相反,Django使用传统的单位名称(KB,MB,GB等)对应于更常用的名称。

first

返回列表中的第一个项目。

例如:

{{ value|first }}

If value is the list ['a', 'b', 'c'], the output will be 'a'.

floatformat

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

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

如果与数字整数参数一起使用,那么floatformat将数字四舍五入到许多小数位。 例如:

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

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

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

如果传递给floatformat的参数是负数,则会将数字四舍五入到许多小数位数 - 但只有在显示小数部分的情况下。 例如:

模板 产量
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过滤器)。 该过滤器立即应用并返回一个新的转义字符串。 在极少数情况下,如果您需要多次转义,或者想要将其他过滤器应用于转义结果,这非常有用。 通常情况下,您要使用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中的字符串。 如果您尝试在URL中使用包含非ASCII字符的字符串,则这是必需的。

对已经通过urlencode过滤器的字符串使用此过滤器是安全的。

例如:

{{ value|iriencode }}

如果value"?test=1&me=2",则输出将是"?test=1&amp;me=2"

join

用一个字符串加入列表,如Python的str.join(list)

例如:

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

If value is the list ['a', 'b', 'c'], the output will be the string "a // b // c".

last

返回列表中的最后一个项目。

例如:

{{ value|last }}

If value is the list ['a', 'b', 'c', 'd'], the output will be the string "d".

length

返回值的长度。 这适用于字符串和列表。

例如:

{{ value|length }}

If value is ['a', 'b', 'c', 'd'] or "abcd", the output will be 4.

过滤器为未定义的变量返回0

length_is

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

例如:

{{ value|length_is:"4" }}

If value is ['a', 'b', 'c', 'd'] or "abcd", the output will be True.

linebreaks

用适当的HTML替换纯文本中的换行符;一个换行符变成一个HTML换行符(&lt; br /&gt;), (</p>

例如:

{{ value|linebreaks }}

If value is Joel\nis a slug, the output will be <p>Joel<br />is a slug</p>.

linebreaksbr

将纯文本中的所有换行符转换为HTML换行符(&lt; br /&gt;)。

例如:

{{ value|linebreaksbr }}

If value is Joel\nis a slug, the output will be 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 }}

如果value 完全 LOVING 这个 相册!,输出将是 完全 爱心 这个 专辑!.

make_list

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

例如:

{{ value|make_list }}

If value is the string "Joel", the output would be the list ['J', 'o', 'e', 'l']. 如果value123,则输出将是列表['1', '2', t6 > '3']

phone2numeric

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

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

例如:

{{ value|phone2numeric }}

如果value800-COLLECT,则输出将是800-2655328

pluralize

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

例:

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

如果num_messages1,输出将是 1 信息。 如果num_messages2,输出将会是 2 消息。

对于需要'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 }}

If value is the list ['a', 'b', 'c', 'd'], the output could be "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" }}

If some_list is ['a', 'b', 'c'], the output will be ['a', 'b'].

slugify

转换为ASCII。 将空格转换为连字符。 删除非字母数字,下划线或连字符的字符。 转换为小写。 也剥去前导和尾随的空白。

例如:

{{ value|slugify }}

If value is "Joel is a slug", the output will be "joel-is-a-slug".

stringformat

根据参数格式化变量,一个字符串格式说明符。 该说明符使用printf-style String Formatting语法,不同之处在于前导的“%”被删除。

例如:

{{ value|stringformat:"E" }}

如果value10,则输出将是1.000000E+01

striptags

尽一切努力去除所有[X] HTML标签。

例如:

{{ value|striptags }}

If value is "<b>Joel</b> <button>is</button> a <span>slug</span>", the output will be "Joel is a slug".

没有安全保证

请注意,striptags不能保证其输出是HTML安全的,特别是对于非有效的HTML输入。 因此,永远不要safe过滤器应用于striptags输出。 如果您正在寻找更强大的功能,可以使用bleach Python库,特别是clean方法。

time

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

Given format can be the predefined one TIME_FORMAT, or a custom format, same as the date filter. 请注意,预定义的格式是区域设置相关的。

例如:

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

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

另一个例子:

假设USE_L10NTrueLANGUAGE_CODE是例如"de"

{{ value|time:"TIME_FORMAT" }}

输出将是字符串"01:23"(与Django一起发布的de语言环境的"TIME_FORMAT"格式说明符是"H:i"

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

There is one exception the above rule: When passed a datetime value with attached timezone information (a time-zone-aware datetime instance) the time filter will accept the timezone-related format specifiers 'e', 'O' , 'T' and 'Z'.

当没有格式字符串时,使用TIME_FORMAT格式说明符:

{{ value|time }}

是相同的:

{{ value|time:"TIME_FORMAT" }}

timesince

将日期格式化为自该日期以来的时间(例如,“4天,6小时”)。

采用一个可选参数,该参数是一个包含要用作比较点的日期的变量(不带参数,比较点现在)。 For example, if blog_date is a date instance representing midnight on 1 June 2006, and comment_date is a date instance for 08:00 on 1 June 2006, then the following would return “8 hours”:

{{ blog_date|timesince:comment_date }}

比较初始偏移和偏移意识的日期时间将返回一个空字符串。

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

timeuntil

timesince类似,只是它测量从现在开始直到给定日期或日期时间的时间。 For example, if today is 1 June 2006 and conference_date is a date instance holding 29 June 2006, then {{ conference_date|timeuntil }} will return “4 weeks”.

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

{{ conference_date|timeuntil:from_date }}

比较初始偏移和偏移意识的日期时间将返回一个空字符串。

分钟是使用的最小单位,“0分钟”将返回过去任何与比较点有关的日期。

title

将字符串转换为标题,方法是用大写字母开始,其余字符用小写字母开头。 这个标签不会保留小写字母。

例如:

{{ value|title }}

如果value“my FIRST ,则输出将是 “我的 第一个 发布”

truncatechars

如果字符串长于指定的字符数,则截断字符串。 截断的字符串将以可转换的省略号序列(“...”)结尾。

论据: 要截断的字符数

例如:

{{ value|truncatechars:9 }}

If value is "Joel is a slug", the output will be "Joel i...".

truncatechars_html

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

例如:

{{ value|truncatechars_html:9 }}

If value is "<p>Joel is a slug</p>", the output will be "<p>Joel i...</p>".

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

truncatewords

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

论据: 要截断的字数

例如:

{{ value|truncatewords:2 }}

If value is "Joel is a slug", the output will be "Joel is ...".

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

truncatewords_html

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

这比truncatewords

例如:

{{ value|truncatewords_html:2 }}

If value is "<p>Joel is a slug</p>", the output will be "<p>Joel is ...</p>".

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

unordered_list

递归地获取自嵌套列表,并返回一个HTML无序列表 - 不打开和关闭

该列表被假定为正确的格式。 For example, if var contains ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']], then {{ var|unordered_list }} would return:

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

upper

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

例如:

{{ value|upper }}

If value is "Joel is a slug", the output will be "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"

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

如果没有提供,则认为“/”字符是安全的。 所有字符应该被转义时,可以提供一个空字符串。 例如:

{{ value|urlencode:"" }}

If value is "https://www.example.org/", the output will be "https%3A%2F%2Fwww.example.org%2F".

urlize

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

此模板标签适用于以http://https://为前缀的链接,或 万维网。. 例如,https://goo.gl/aia1t将被转换,但goo.gl/aia1t不会。

It also supports domain-only links ending in one of the original top level domains (.com, .edu, .gov, .int, .mil, .net, and .org). For example, djangoproject.com gets converted.

Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens), and urlize will still do the right thing.

urlize生成的链接添加了rel="nofollow"属性。

例如:

{{ value|urlize }}

如果value“Check out “Check out &lt; a href =”http://www.djangoproject.com“ t10> rel =“nofollow”&gt; www.djangoproject.com&lt; / a&gt;“

In addition to web links, urlize also converts email addresses into 邮寄地址: 链接。 If value is "Send questions to foo@example.com", the output will be "Send questions to <a href="mailto:foo@example.com">foo@example.com</a>".

The urlize filter also takes an optional parameter autoescape. 如果autoescapeTrue,则链接文本和网址将使用Django内置的escape过滤器进行转义。 autoescape的默认值是True

注意

如果urlize应用于已包含HTML标记的文本,则事情不会按预期工作。 仅将此筛选器应用于纯文本。

urlizetrunc

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

论据: 链接文本的字符数应该被截断,包括如果截断是必要的添加的省略号。

例如:

{{ value|urlizetrunc:15 }}

如果value“Check out 将是'Check out &lt; a href =“http://www.djangoproject.com” t10> rel =“nofollow”&gt; www.djangopr ...&lt; / a&gt;'

urlize一样,此过滤器只能应用于纯文本。

wordcount

返回单词的数量。

例如:

{{ value|wordcount }}

If value is "Joel is a slug", the output will be 4.

wordwrap

用指定的行长包装单词。

论据: 包装文本的字符数

例如:

{{ value|wordwrap:5 }}

If value is Joel is a slug, the output would be:

Joel
is a
slug

yesno

TrueFalse和(可选)None的值映射到字符串“是”,“否”,“可能”或自定义映射作为逗号分隔列表传递,并根据值返回其中一个字符串:

例如:

{{ value|yesno:"yeah,no,maybe" }}
论据 输出
真正  
真正 “是啊,不,也许” 是啊
“是啊,不,也许” 没有
没有 “是啊,不,也许” 也许
没有 “是啊,不” no (converts None to False if no mapping for None is given)

国际化标签和过滤器

Django提供模板标签和过滤器来控制模板中的internationalization的每个方面。 它们可以精确控制翻译,格式和时区转换。

i18n

该库允许在模板中指定可翻译的文本。 To enable it, set USE_I18N to True, then load it with {% load i18n %}.

请参阅Internationalization: in template code

l10n

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

请参阅Controlling localization in templates

tz

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

请参阅Time zone aware output in templates

其他标签和过滤器库

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

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上下文中使用它,我们确保它被正确地转义。