头部背景图

Django内置模板标签和过滤器大全

:soogor 2022-07-09 19:25:31 :91
内置模板标签和过滤器¶本文档介绍了 Django 的内置模板标签和过滤器。建议您使用自动文档(如果可用),因为这还将包括已安装的任何自定义标记或筛选器的文档。内置标签参考¶autoescape¶控制当前的自动转义行为。此标记将 或 作为参数,并确定自动转义是否在块内生效。块用结束标记结束。onoffendautoescape当自动转义生效时,所有变量内容在将结果放入输出之前

内置模板标签和过滤器¶

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

内置标签参考¶

autoescape

控制当前的自动转义行为。此标记将 或 作为参数,并确定自动转义是否在块内生效。块用结束标记结束。onoffendautoescape

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

唯一的例外是已被标记为“安全”不进行转义的变量,这些变量要么是由填充变量的代码标记的,要么是因为它应用了转义筛选器。

示例用法:

{% 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,第二次迭代生成引用类,第三次迭代再次引用类,依此类推。row1row2row1

您也可以使用变量。例如,如果您有两个模板变量 和 ,则可以在它们的值之间交替,如下所示: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 %}

在某些情况下,您可能希望引用周期的当前值,而不前进到下一个值。为此,请使用“as”为标签命名,如下所示:{% cycle %}

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

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

<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>classrow1row2rowcolors<tr>silentrow1row2<tr>

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

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

您可以使用 %}

debug

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

Django 2.2.27 中的更改:

在旧版本中,当 False

extends

指示此模板扩展了父模板。

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

  • {% extends "base.html" %}(带引号)使用文本值作为要扩展的父模板的名称。"base.html"
  • {% extends variable %}使用 的值。如果变量的计算结果为字符串,Django 将使用该字符串作为父模板的名称。如果变量计算为一个对象,Django将使用该对象作为父模板。variableTemplate

有关详细信息,请参阅模板继承。

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

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

注意

autoescape 标记来管理模板代码块的自动转义。

firstof

输出第一个不是“false”的参数变量(即存在、不为空、不是 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 %}

请记住,对于点运算符,字典键查找优先于方法查找。因此,如果字典包含名为 的键,将返回而不是 。如果要在模板(、等)中使用字典方法,请避免添加以字典方法命名的键。在keys

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

变量 描述
forloop.counter 循环的当前迭代(1 个索引)
forloop.counter0 循环的当前迭代(0 索引)
forloop.revcounter 从循环结束开始的迭代次数(1 个索引)
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

标签计算一个变量,如果该变量为“true”(即存在,不为空,也不是假布尔值),则输出块的内容:{% 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 %}

布尔运算符¶

not

{% if athlete_list and coach_list %}
    Both athletes and coaches are available.
{% endif %}

{% if not athlete_list %}
    There are no athletes.
{% endif %}

{% if athlete_list or coach_list %}
    There are some athletes or some coaches.
{% endif %}

{% if not athlete_list or coach_list %}
    There are no athletes or there are some coaches.
{% endif %}

{% if athlete_list and not coach_list %}
    There are some athletes and absolutely no coaches.
{% endif %}

允许在同一标记内同时使用子句和子句,其优先级高于例如:andorandor

{% if athlete_list and coach_list or cheerleader_list %}

将解释为:

if (athlete_list and coach_list) or cheerleader_list

在 if 标记。

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

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

通常,模板名称相对于模板加载程序的根目录。字符串参数也可以是以扩展标记开头或如../

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

{% include template_name %}

该变量也可以是具有接受上下文的方法的任何对象。这允许您在上下文中引用已编译的。render()Template

此外,该变量可能是模板名称的可迭代对象,在这种情况下,将按照select_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

加载自定义模板标签集。

例如,以下模板将加载在包中注册并位于包中的所有标记和筛选器:somelibraryotherlibrarypackage

{% load somelibrary package.otherlibrary %}

您还可以使用参数有选择地从库中加载单个筛选器或标记。在此示例中,命名和的模板标记/筛选器将从 以下位置加载:fromfoobarsomelibrary

{% load foo bar from somelibrary %}

有关详细信息,请参阅自定义标记和筛选器库。

lorem

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

用法:

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

该标记可以与零个、一个、两个或三个参数一起使用。参数是:{% lorem %}

论点 描述
count 一个数字(或变量),包含要生成的段落或单词数(默认值为 1)。
method 用于单词、HTML 段落或纯文本段落块(默认值为 )。wpbb
random 这个词,如果给出,在生成文本时不使用共同的段落(“Lorem ipsum dolor sit amet...”)。random

例子:

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

now

显示当前日期和/或时间,使用基于给定字符串的格式。此类字符串可以包含格式说明符字符,如日期筛选器部分所述。

例:

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

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

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

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

注意

传递的格式也可以是预定义的格式之一格式本地化而异,例如:

It is {% now "SHORT_DATETIME_FORMAT" %}

还可以使用该语法将输出(作为字符串)存储在变量中。如果您想在模板标记(如%}

{% now "Y" as current_year %}
{% blocktranslate %}Copyright {{ current_year }}{% endblocktranslate %}

regroup

按公共属性对相似对象的列表重新分组。

这个复杂的标签最好通过一个例子来说明:假设这是一个由包含 、和键的字典表示的城市列表:cities"name""population""country"

cities = [
    {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
    {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
    {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
    {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
    {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]

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

  • 印度
    • 孟买: 19,000,000
    • 加尔各答: 15,000,000
  • 美国
    • 纽约: 20,000,000
    • 芝加哥: 7,000,000
  • 日本
    • 东京: 33,000,000

您可以使用标记按国家/地区对城市列表进行分组。以下模板代码片段将实现此目的:{% regroup %}

{% regroup cities by country as country_list %}

<ul>
{% for country in country_list %}
    <li>{{ country.grouper }}
    <ul>
        {% for city in country.list %}
          <li>{{ city.name }}: {{ city.population }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

让我们看一下此示例。 采用三个参数:要重新分组的列表、要分组依据的属性以及结果列表的名称。在这里,我们按属性重新组合列表并调用结果。{% regroup %}citiescountrycountry_list

{% regroup %}生成组对象的列表(在本例中为 )。组对象是 country_list

  • grouper– 分组依据的项目(例如,字符串“印度”或“日本”)。
  • list– 此组中所有项目的列表(例如,国家/地区=“印度”的所有城市的列表)。

由于生成 %}

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

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

按其他属性分组¶

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

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

或者,如果 是 带有 的字段,它将具有一个可用作属性choices

{% regroup cities by get_country_display as country_list %}

{{ country.grouper }}现在将显示集合中的值字段,而不是键。choices

resetcycle

重置上一个%}

用法示例:

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

示例用法:

The {% templatetag openblock %} characters open a block.

另请参阅逐字标记,了解包含这些字符的另一种方法。

url

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

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

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

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

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

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

例如,假设您有一个视图 ,其 URLconf 采用客户端 ID(此处为视图文件中的一个方法)。URLconf 行可能如下所示:app_views.clientclient()app_views.py

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>

由语法创建的变量的作用域是标记所在的范围。as var{% block %}{% url %}

如果缺少视图,则此语法会导致错误。在实践中,您将使用它来链接到可选视图:{% url ... as 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' %}

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

警告

不要忘记在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 %}">

如果 为 175、为 200 且为 100,则上述示例中的图像将为 88 像素宽(因为 175/200 = .875;.875 * 100 = 87.5,向上舍入为 88)。this_valuemax_valuemax_width

在某些情况下,您可能希望在变量中捕获 的结果。例如,在像这样的widthratio

{% widthratio this_value max_value max_width as width %}
{% blocktranslate %}The width is: {{ width }}{% endblocktranslate %}

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

如果 是 ,则输出将为 。value46

此筛选器将首先尝试将两个值强制转换为整数。如果此操作失败,它将尝试将这些值相加。这将适用于某些数据类型(字符串,列表等),而在其他数据类型上失败。如果失败,结果将是空字符串。

例如,如果我们有:

{{ first|add:second }}

并且 is 和 is ,则输出将为 。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() 函数类似的格式,但有一些区别。

注意

这些格式字符在模板之外的Django中不会使用。它们被设计为与PHP兼容,以简化设计人员的过渡。

可用的格式字符串:

格式化字符 描述 示例输出
   
d 月份中的某一天,2 位数字,前导零。 '01''31'
j 不带前导零的月份中的某一天。 '1''31'
D 星期几,文本,3个字母。 'Fri'
l 星期几,文本,长。 'Friday'
S 英文序号后缀,表示月份中的某一天,2 个字符。 'st''nd''rd''th'
w 星期几,不带前导零的数字。 '0'(星期日)至(星期六)'6'
z 一年中的某一天。 1366
   
W ISO-8601 周数为年,周数从星期一开始。 1,53
   
m 月份,2 位数字,前导零。 '01''12'
n 不带前导零的月份。 '1''12'
M 月份,文本,3个字母。 'Jan'
b 月份,文本,3 个字母,小写。 'jan'
E 月份,特定于区域设置的替代表示形式,通常用于长日期表示形式。 'listopada'(对于波兰语区域设置,而不是'Listopad')
F 月,文本,长。 'January'
N 美联社风格的月份缩写。专有扩展。 'Jan.', , ,'Feb.''March''May'
t 指定月份中的天数。 2831
   
y 年份,2 位数字,前导零。 '00''99'
Y 年份,4 位数字,前导零。 '0001', ..., , ...,'1999''9999'
L 布尔值表示它是否是闰年。 TrueFalse
o ISO-8601 周编号年份,对应于使用闰周的 ISO-8601 周编号 (W)。有关更常见的年份格式,请参见 Y。 '1999'
时间    
g 小时,12 小时格式,不带前导零。 '1''12'
G 小时,24 小时格式,不带前导零。 '0''23'
h 小时,12 小时格式。 '01''12'
H 小时,24 小时格式。 '00''23'
i 纪要。 '00''59'
s 秒,2 位数字,前导零。 '00''59'
u 微秒。 000000999999
a 'a.m.'或(请注意,这与 PHP 的输出略有不同,因为这包括与美联社样式匹配的句点。'p.m.' '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''0'
O 与格林威治时间的差异(以小时为单位)。 '+0200'
T 此计算机的时区。 'EST','MDT'
Z 时区偏移量(以秒为单位)。UTC 以西时区的偏移量始终为负数,UTC 以东的时区的偏移量始终为正数。 -4320043200
日期/时间    
c ISO 8601 格式。(注意:与其他格式化程序(如“Z”、“O”或“r”)不同,如果值是朴素的日期时间,则“c”格式化程序不会添加时区偏移量(请参阅 datetime.tzinfo)。 2008-01-02T10:30:00.000123+02:00,或者如果日期时间很幼稚2008-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" }}

如果 是2008'

传递的格式可以是预定义的格式之一SHORT_DATETIME_FORMAT,也可以是使用上表中显示的格式说明符的自定义格式。请注意,预定义的格式可能因当前区域设置而异。

假设 "es"

{{ value|date:"SHORT_DATE_FORMAT" }}

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

如果不使用格式字符串,则使用格式说明符。假设设置与前面的示例相同:DATE_FORMAT

{{ value|date }}

输出(区域设置的格式说明符是 )。“d”和“e”都是反斜杠转义的,因为否则每个都是一个格式字符串,分别显示日期和时区名称。9 de Enero de 2008DATE_FORMATesr'j \d\e F \d\e Y'

可以与datetime

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

default

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

例如:

{{ value|default:"nothing" }}

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

default_if_none

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

请注意,如果给定空字符串,则不会使用默认值。如果要回退空字符串,请使用默认筛选器。

例如:

{{ value|default_if_none:"nothing" }}

如果 是 ,则输出将为 。valueNonenothing

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

字典不支持按指定索引处的元素排序。

Django 2.2.26 中的更改:

在旧版本中,字典上支持对指定索引处的元素进行排序。

dictsortreversed

获取字典列表,并返回该列表,该列表按参数中给定的键以相反的顺序排序。这与上述筛选器的工作方式完全相同,但返回值将按相反的顺序排列。

divisibleby

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

例如:

{{ value|divisibleby:"3" }}

如果 是 ,则输出为 。value21True

escape

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

  • <转换为&lt;
  • >转换为&gt;
  • '(单引号)转换为&#x27;
  • "(双引号)转换为&quot;
  • &转换为&amp;

应用于通常将自动转义应用于结果的变量,只会导致执行一轮转义。因此,即使在自动转义环境中使用此功能也是安全的。如果要应用多个转义刀路,请使用escape

例如,您可以在escape

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

escapejs

转义字符以在 JavaScript 字符串中使用。这并不能使字符串在 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 }}

如果 123456789,则输出将为 。value117.7 MB

文件大小和 SI 单位

严格来说,不符合国际单位制,该制度建议在以1024的幂计算字节大小时使用KiB,MiB,GiB等(这里就是这种情况)。相反,Django使用传统的单位名称(KB,MB,GB等),对应于更常用的名称。filesizeformat

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

如果传递给的参数具有后缀,它将强制按活动区域en

value 模板 输出
34232.34 {{ value|floatformat:"2g" }} 34,232.34
34232.06 {{ value|floatformat:"g" }} 34,232.1
34232.00 {{ value|floatformat:"-3g" }} 34,232

输出始终是本地化的(独立于 pl

value 模板 输出
34.23234 {{ value|floatformat:"3" }} 34,232
34.23234 {{ value|floatformat:"3u" }} 34.232

不带参数的使用等效于不带参数的 。floatformatfloatformat-1

Django 4.0 中已更改:

floatformat模板筛选器不再依赖于USE_L10N设置,并且始终返回本地化的输出。

添加了强制禁用本地化的后缀。u

force_escape

将 HTML 转义应用于字符串(有关详细信息,请参阅转义筛选器。

例如,如果要捕获由<p>

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

get_digit

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

例如:

{{ value|get_digit:"2" }}

如果 是 ,则输出将为 。value1234567898

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,包装在标记中,准备与 JavaScript 一起使用。<script>

论点:标记的可选 HTML“id”。<script>

例如:

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

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

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

生成的数据可以在JavaScript中访问,如下所示:

const 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>

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

Django 4.1 中已更改:

在旧版本中,HTML“id”是必需的参数。

last

返回列表中的最后一项。

例如:

{{ value|last }}

如果 是 列表 ,则输出将是字符串 。value['a', 'b', 'c', 'd']"d"

length

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

例如:

{{ value|length }}

如果 是 或,则输出将为 。value['a', 'b', 'c', 'd']"abcd"4

筛选器将返回未定义的变量。0

length_is

如果值的长度是参数,则返回该值。TrueFalse

例如:

{{ 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 slugJoel<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-COLLECT800-2655328

pluralize

如果值不是 、 或长度为 1 的对象,则返回复数后缀。默认情况下,此后缀为 。1'1''s'

例:

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

如果 是 ,则输出将为 If 是 输出将为num_messages1You have 1 message.num_messages2You have 2 messages.

对于需要除 以外的后缀的单词,您可以提供备用后缀作为过滤器的参数。's'

例:

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

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

例:

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

注意

使用块翻译对已翻译的字符串进行复数化。

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

将联接)结合使用时很有用。例如:

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

在这种情况下,您不能直接使用安全筛选器,因为它会首先将变量转换为字符串,而不是使用序列的各个元素。

slice

返回列表的一个部分。

使用与 Python 的列表切片相同的语法。有关简介,请参阅 https://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 样式的字符串格式语法,但前导“%”被删除的情况除外。

例如:

{{ value|stringformat:"E" }}

如果 是 ,则输出将为 。value101.000000E+01

striptags

尽一切可能去除所有 [X]HTML 标记。

例如:

{{ value|striptags }}

如果 是 ,则输出将为 。value"<b>Joel</b> <button>is</button> a <span>slug</span>""Joel is a slug"

无安全保障

请注意,这并不能保证其输出是HTML安全的,特别是对于无效的HTML输入。因此,切勿将筛选器应用于输出。如果你正在寻找更健壮的东西,你可以使用Python库,特别是它的bleach

time

根据给定的格式设置时间格式。

给定格式可以是日期筛选器相同的自定义格式。请注意,预定义的格式与区域设置相关。

例如:

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

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

请注意,如果要使用“raw”值,则可以对格式字符串进行反斜杠转义。在此示例中,“h”和“m”都是反斜杠转义的,否则每个都是分别显示小时和月份的格式字符串:

{{ value|time:"H\h i\m" }}

这将显示为“01h 23m”。

另一个例子:

假设 "de"

{{ value|time:"TIME_FORMAT" }}

输出将是字符串(Django附带的语言环境的格式说明符是)。"01:23""TIME_FORMAT"de"H:i"

筛选器将仅接受格式字符串中与一天中的时间相关的参数,而不接受日期。如果需要设置值的格式,请改用date

上述规则有一个例外:当传递带有附加时区信息的值('Z'

当不使用格式字符串时,将使用格式说明符:TIME_FORMAT

{{ value|time }}

与:

{{ value|time:"TIME_FORMAT" }}

timesince

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

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

{{ blog_date|timesince:comment_date }}

比较偏移量朴素和偏移量感知日期时间将返回一个空字符串。

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

timeuntil

与 类似,只是它测量从现在到给定日期或日期的时间。例如,如果今天是 2006 年 6 月 1 日,并且是 2006 年 6 月 29 日的日期实例,则将返回“4 周”。timesinceconference_date{{ conference_date|timeuntil }}

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

{{ conference_date|timeuntil:from_date }}

比较偏移量朴素和偏移量感知日期时间将返回一个空字符串。

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

title

通过将单词以大写字符开头,其余字符以小写开头,将字符串转换为标题大小写。此标记不会努力将“琐碎的单词”保留为小写。

例如:

{{ value|title }}

如果 是 ,则输出将为 。value"my FIRST post""My First Post"

truncatechars

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

论点:要截断的字符数

例如:

{{ value|truncatechars:7 }}

如果 是 ,则输出将为 。value"Joel is a slug""Joel i…"

truncatechars_html

与截字符类似,只是它知道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

与截断字类似,只是它能识别 HTML 标记。在字符串中打开且未在截断点之前关闭的任何标记都将在截断后立即关闭。

这比截断词效率低,因此应仅在传递 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"

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

如果未提供,则假定“/”字符是安全的。当应对所有字符进行转义时,可以提供空字符串。例如:

{{ value|urlencode:"" }}

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

urlize

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

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

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

链接可以具有尾随标点符号(句点、逗号、近角线)和前导标点符号(开头标点),并且仍将执行正确的操作。urlize

生成的链接具有添加到其中的属性。urlizerel="nofollow"

例如:

{{ value|urlize }}

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

除了 Web 链接之外,还会将电子邮件地址转换为链接。如果 是 ,则输出将为 。urlizemailto:value"Send questions to foo@example.com""Send questions to <a href="mailto:foo@example.com">foo@example.com</a>"

筛选器还采用可选参数 。如果是,链接文本和URL将使用Django的内置True

注意

如果应用于已包含 HTML 标记的文本,或应用于包含单引号 () 的电子邮件地址,则操作将无法按预期工作。仅将此筛选器应用于纯文本。urlize'

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

将 、 和 (可选)的值映射到字符串“yes”、“no”、“maybe”或作为逗号分隔列表传递的自定义映射,并根据该值返回其中一个字符串:TrueFalseNone

例如:

{{ 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(如果没有给出 的映射,则转换为)NoneFalseNone

国际化标签和过滤器¶

Django提供了模板标签和过滤器来控制模板中国际化的各个方面。它们允许对翻译、格式设置和时区转换进行精细控制。

i18n

此库允许在模板中指定可翻译文本。要启用它,请将 %}

请参阅国际化:在模板代码中。

l10n

此库提供对模板中值本地化的控制。您只需要使用 加载库,但您通常会将True

请参阅控制模板中的本地化。

tz

此库提供对模板中时区转换的控制。像 一样,您只需要使用 加载库,但通常还会将True

请参阅模板中的时区感知输出。

其他标签和过滤器库¶

Django附带了其他几个模板标签库,您必须在%}标签。

django.contrib.humanize

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

static

static

要链接到保存在url()

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

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

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

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

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

使用 Jinja2 模板?

有关将标记与 static

get_static_prefix

您应该更喜欢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_media_prefix

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

通过将值存储在数据属性中,我们确保在要在 JavaScript 上下文中使用它时,可以适当地转义它。

本文编辑:soogor
暂无评论,期待你的首评
宝塔Django项目生成requirements.txt失败原因及解决办法

[Django]宝塔Django项目生成requirements.txt失败原因及解决办法

我们有时候需要将一个项目转到别的服务器,或移给别的项目做基础程序使用,这样我们就需要效取一下当前的运行环境。django可以很方便的让我们来进行这些操作宝塔Django...
2022年9月15日 21:55
Django项目如何修改文件自动重启,Django 远程API重启项目方法分享

[Django]Django项目如何修改文件自动重启,Django 远程API重启项目方法分享

我们在soogor CMS 中加了些特殊的配置,需要重启项目才可以生效。所以我们就需要一个自动或者远程重启的方法。下面就分享一下“Django项目如何修改文件自动重启,Django...
2022年9月15日 15:09
python批量删除django不需要的图片代码

[Python]python批量删除django不需要的图片代码

我们在使用soogorfactory批量生产文章图片的时候,会遇到这么一种情况,就是文章生成后,发现有重复生产的,或者因远程原因我们发布失败,这就造成了我们的图片多余了。...
2022年7月10日 22:24
Django ORM查询方法汇总,Django数据库查询方法大全

[Django]Django ORM查询方法汇总,Django数据库查询方法大全

什么是Django ORM?ORM : 全称 object relational mapping, 对象关系映射功能 : 通过orm实现使用操作对象的方式来操作数据库中的数据目的 : 就是为了能够让不懂SQL语句...
2022年6月15日 23:00
Soogor CMS模板标签

[开始]Soogor CMS模板标签

soogor CMS用Django开发,在继承Django标签规则后,我们又开发了一些适合大家使用的标签。首先我们为大家总结了Django标签的使用方法:《Django 模板标签用法大全》,我...
2022年6月2日 10:40
Django模板过滤器怎么用?Django模板过滤器用法大全

[Django]Django模板过滤器怎么用?Django模板过滤器用法大全

Django模板过滤器是我们在做SoogorCMS模板时经常需要用到的功能。过滤器看上去是一个“|”,但是|后的功能却是非常多,合理的使用这些功能会给我们在SoogorCMS前端模板...
2022年5月27日 01:52
Django如何生成二维码?Django如何实现扫码浏览

[Django]Django如何生成二维码?Django如何实现扫码浏览

随着移动应用的越来越方便,我们在设置网站时就必须要考虑移动端的体验,甚至有的网站就直接不做PC端了,而只做移动端 。Soogr CMS一直就是推荐大家将网站做成自适应的...
2022年5月26日 00:28
django+uwsgi修改Django代码或修改静态文件后,如何uwsgi 自动重启项目

[Django]django+uwsgi修改Django代码或修改静态文件后,如何uwsgi 自动重启项目

Soogor CMS可以使用django+uwsgi,我们官方网站就是这种方式搭建的,当然Django也支持其他形式的搭建。我们在开发环境时很多采用了修改代码自动上传功能,代码上传后,我...
2022年5月22日 22:55
Django 如何自动推送百度?Django自动推送神马代码

[Django]Django 如何自动推送百度?Django自动推送神马代码

我们在做网站的时候都希望程序可以携带很多附近功能,可以减少我们的劳动量。比如我们在做SEO的时候,就经常需要向搜索引擎推送链接。在日常的工作当中,我们推送的方式...
2022年5月22日 22:47
Django 模板标签用法大全,Django 模板各种标签用法汇总

[Django]Django 模板标签用法大全,Django 模板各种标签用法汇总

本文汇总我们在使用Django 模板时所需要的模板标签的各种用法,标签用法包括Django 模板的基础用法和各种高级用法。本文持续更新根据字符串长度截取字符串{{data|slice:...
2022年5月14日 14:25
Copyright © 2022 All Rights Reserved 山东上格信息科技有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.