Spec-Zone.ru › Django 5.2

Встроенные теги и фильтры шаблонов

В данном документе описаны встроенные теги и фильтры Django. Рекомендуется использовать автоматическую документацию, если она доступна, так как она также включает документацию для любых пользовательских тегов или фильтров, установленных в системе.

Справочник по встроенным тегам

autoescape

Управляет текущим поведением автоматической обработки HTML-сущностей. Этот тег принимает в качестве аргумента либо on, либо off, что определяет, включено ли автоматическое экранирование внутри блока. Блок закрывается закрывающим тегом endautoescape.

Пример использования:

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

Когда автоматическая обработка HTML-сущностей включена, всё содержимое, полученное из переменных, подвергается экранированию HTML-сущностей, прежде чем результат будет помещён в вывод (но после применения любых фильтров). Это эквивалентно ручному применению фильтра escape к каждой переменной.

Исключение составляют переменные, уже помеченные как «безопасные» от экранирования. Переменные могут быть помечены как «безопасные» кодом, который заполнил переменную, путём применения фильтров safe или escape, или потому, что это результат предыдущего фильтра, который пометил строку как «безопасную».

Внутри области отключенного автоматического экранирования, цепочка фильтров, включая escape, может привести к неожиданным (но задокументированным) результатам, таким как следующие:

{% autoescape off %}
    {{ my_list|join:", "|escape }}
{% endautoescape %}

Вышеприведённый код выведет объединённые элементы my_list без экранирования. Это связано с тем, что последовательность применения фильтров сначала выполняет join над my_list (без применения экранирования к каждому элементу, так как autoescape является off), помечая результат как безопасный. Впоследствии этот безопасный результат будет передан фильтру escape, который не применяет второе экранирование.

Для правильного экранирования каждого элемента в последовательности используйте фильтр escapeseq:

{% autoescape off %}
    {{ my_list|escapeseq|join:", " }}
{% 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 и так далее для каждого цикла.

Вы также можете использовать переменные. Например, если у вас есть две переменные шаблона, rowvalue1 и rowvalue2, вы можете чередовать их значения так:

{% 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, использование {% cycle %}, которое инициирует цикл, само по себе выведет первое значение в цикле. Это может быть проблемой, если вы хотите использовать значение вложенном цикле или включённом шаблоне. Если вы хотите только объявить цикл, но не выводить первое значение, вы можете добавить ключевое слово silent в качестве последнего ключевого слова в теге. Например:

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

Это выведет список элементов <tr> с class, чередующимся между row1 и row2. Подшаблон получит доступ к rowcolors в своём контексте, и значение будет соответствовать классу <tr>, который его заключает. Если ключевое слово silent было бы опущено, row1 и row2 были бы выведены как обычный текст, вне элемента <tr>.

Когда используется ключевое слово silent для определения цикла, отключение автоматически применяется ко всем последующим использованиям этого конкретного тега цикла. Следующий шаблон выведет ничего, даже если второй вызов {% cycle %} не указывает silent:

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

Вы можете использовать тег resetcycle, чтобы тег {% cycle %} перезапустился со своего первого значения, когда он встретится снова.

debug

Выводит множество отладочной информации, включая текущий контекст и импортированные модули. {% debug %} ничего не выводит, когда настройка DEBUG установлена в False.

extends

Указывает, что этот шаблон расширяет родительский шаблон.

Этот тег может быть использован двумя способами:

  • {% extends "base.html" %} (в кавычках) использует буквальное значение "base.html" как имя родительского шаблона для расширения.
  • {% extends variable %} использует значение переменной variable. Если переменная имеет строковое значение, Django использует эту строку как имя родительского шаблона. Если переменная имеет значение объекта Template, Django использует этот объект как родительский шаблон.

Дополнительную информацию см. в разделе Наследование шаблонов.

Обычно имя шаблона относительно корневого каталога загрузчика шаблонов. Строковый аргумент также может быть относительным путём, начинающимся с ./ или ../. Например, рассмотрим следующую структуру каталогов:

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

В template.html следующие пути будут допустимы:

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

filter

Фильтрует содержимое блока с помощью одного или нескольких фильтров. Несколько фильтров можно указать с помощью символа «|», и фильтры могут иметь аргументы, как и в синтаксисе переменных.

Обратите внимание, что блок включает всё содержимое между тегами filter и endfilter.

Пример использования:

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

Примечание

Фильтры escape и safe не являются допустимыми аргументами. Вместо этого используйте тег autoescape для управления автоматическим экранированием блоков шаблона.

firstof

Выводит первую переменную аргумента, которая не является «ложной» (т. е. существует, не пустая, не ложное булево значение и не нулевое числовое значение). Не выводит ничего, если все переданные переменные являются «ложными».

Пример использования:

{% firstof var1 var2 var3 %}

Это эквивалентно:

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

Вы также можете использовать литеральную строку в качестве значения по умолчанию, если все переданные переменные ложные:

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

Этот тег автоматически экранирует значения переменных. Вы можете отключить автоматическое экранирование с помощью:

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

Или, если некоторые переменные должны быть экранированы, вы можете использовать:

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

Вы можете использовать синтаксис {% firstof var1 var2 var3 as value %} для хранения результата в переменной.

for

Перебирает каждый элемент в массиве, делая элемент доступным в переменной контекста. Например, чтобы отобразить список спортсменов, предоставленных в athlete_list:

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

Вы можете перебрать список в обратном порядке, используя {% for obj in list reversed %}.

Если вам нужно перебрать список списков, вы можете распаковать значения в каждом подсписке в отдельные переменные. Например, если ваш контекст содержит список координат (x, y) под названием points, вы можете использовать следующее для вывода списка точек:

{% for x, y in points %}
    There is a point at {{ x }},{{ y }}
{% endfor %}

Это также может быть полезно, если вам нужно получить доступ к элементам в словаре. Например, если ваш контекст содержал словарь data, следующее отобразит ключи и значения словаря:

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

Обратите внимание, что для оператора точки поиск по ключу словаря имеет приоритет над поиском по методу. Таким образом, если словарь data содержит ключ под названием 'items', data.items вернёт data['items'] вместо data.items(). Избегайте добавления ключей, которые имеют имена, подобные именам методов словаря, если вы хотите использовать эти методы в шаблоне (items, values, 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

Тег {% 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 теги могут использовать and, or или 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 %}

Использование как and, так и or блоков в одном теге разрешено, причем and имеет более высокий приоритет, чем or, например:

{% if athlete_list and coach_list or cheerleader_list %}

будет интерпретироваться как:

if (athlete_list and coach_list) or cheerleader_list:
    ...

Использование фактических скобок в теге if является недопустимым синтаксисом. Если вам нужно использовать их для указания приоритета, вы должны использовать вложенные теги if.

if теги также могут использовать операторы ==, !=, <, >, <=, >=, in, not in, is и is 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" %}

Обычно имя шаблона относительно корневого каталога загрузчика шаблонов. Строковый аргумент также может быть относительным путем, начинающимся с ./ или ../, как описано в теге extends.

В этом примере содержимое шаблона, имя которого содержится в переменной 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», а не как «распарсить этот подшаблон и включить его содержимое так, как будто оно является частью родительского шаблона». Это означает, что между включёнными шаблонами нет общего состояния – каждый include представляет собой полностью независимый процесс отображения.

Блоки вычисляются до включения. Это означает, что шаблон, включающий блоки из другого, будет содержать блоки, которые уже были вычислены и отображены, а не блоки, которые могут быть переопределены, например, расширяющим шаблоном.

load

Загружает набор пользовательских тегов шаблона.

Например, следующий шаблон загрузит все зарегистрированные теги и фильтры в somelibrary и otherlibrary, расположенные в пакете package:

{% load somelibrary package.otherlibrary %}

Вы также можете выборочно загрузить отдельные фильтры или теги из библиотеки, используя аргумент from. В этом примере будут загружены теги/фильтры с именами foo и bar из somelibrary:

{% load foo bar from somelibrary %}

См. Библиотеки пользовательских тегов и фильтров для получения дополнительной информации.

lorem

Отображает случайный латинский текст «lorem ipsum». Это полезно для предоставления образцовых данных в шаблонах.

Использование:

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

Тег {% lorem %} может быть использован с нулём, одним, двумя или тремя аргументами. Аргументы:

Аргумент

Описание

count

Число (или переменная), содержащее количество абзацев или слов для генерации (по умолчанию 1).

method

Либо w для слов, либо p для HTML абзацев или b для абзацев в простом тексте (по умолчанию b).

random

Слово random, при указании которого не используется стандартный абзац («Lorem ipsum dolor sit amet…») при генерации текста.

Примеры:

  • {% lorem %} выведет стандартный абзац «lorem ipsum».
  • {% lorem 3 p %} выведет стандартный абзац «lorem ipsum» и два случайных абзаца, каждый обернутый в HTML теги <p>.
  • {% lorem 2 w random %} выведет два случайных латинских слова.

now

Отображает текущую дату и/или время, используя формат, соответствующий заданной строке. Эта строка может содержать символы спецификаторов формата, как описано в разделе фильтра date.

Пример:

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

Обратите внимание, что вы можете экранировать строку формата обратной косой чертой, если хотите использовать «сырое» значение. В этом примере оба символа «o» и «f» экранированы обратной косой чертой, так как в противном случае каждый из них является строкой формата, отображающей год и время соответственно:

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

Это выведет «Сегодня 4 сентября».

Примечание

Передаваемый формат также может быть одним из предопределённых DATE_FORMAT, DATETIME_FORMAT, SHORT_DATE_FORMAT или SHORT_DATETIME_FORMAT. Предопределённые форматы могут отличаться в зависимости от текущего языка и если Локализация форматов включена, например:

It is {% now "SHORT_DATETIME_FORMAT" %}

Вы также можете использовать синтаксис {% now "Y" as current_year %} для хранения вывода (как строки) в переменной. Это полезно, если вы хотите использовать {% now %} внутри тега шаблона, такого как blocktranslate, например:

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

querystring

Новое в Django 5.1.

Выводит URL-кодированную строку запроса, основанную на предоставленных параметрах.

Этот тег требует экземпляр QueryDict, который по умолчанию равен request.GET, если он не предоставлен.

Если QueryDict пуста и дополнительные параметры не предоставлены, возвращается пустая строка. В противном случае результат включает ведущий "?".

Использование request.GET по умолчанию

Чтобы использовать request.GET в качестве значения по умолчанию для QueryDict, должен быть включён обработчик контекста django.template.context_processors.request. Если он не включён, вы должны либо явно передать объект request в контекст шаблона, либо предоставить экземпляр QueryDict этому тегу.

Базовое использование

{% querystring %}

Выводит текущую строку запроса дословно. Итак, если строка запроса – ?color=green, результат отобразится как ?color=green.

{% querystring size="M" %}

Выводит текущую строку запроса с добавлением параметра size. В соответствии с предыдущим примером, результат отобразится как ?color=green&size=M.

Пользовательская QueryDict

{% querystring my_query_dict %}

Вы можете предоставить пользовательскую QueryDict для использования вместо request.GET. Итак, если my_query_dict – <QueryDict: {'color': ['blue']}>, результат отобразится как ?color=blue.

Установка элементов

{% querystring color="red" size="S" %}

Добавляет или изменяет параметры в строке запроса. Каждый именованный аргумент будет добавлен в строку запроса, заменяя любое существующее значение для этого ключа. Например, если текущая строка запроса – ?color=green, результат отобразится как ?color=red&size=S.

Удаление элементов

{% querystring color=None %}

Передача None в качестве значения удаляет параметр из строки запроса. Например, если текущая строка запроса – ?color=green&size=M, результат отобразится как ?size=M.

Обработка списков

{% querystring color=my_list %}

Если my_list – ["red", "blue"], результат отобразится как ?color=red&color=blue, сохраняя структуру списка в строке запроса.

Динамическое использование

Типичный пример использования этого тега – сохранение текущей строки запроса при отображении страницы результатов, одновременно добавляя ссылки на предыдущие и следующие страницы результатов. Например, если постраничный вывод находится на странице 3, и текущая строка запроса – ?color=blue&size=M&page=3, следующий код выведет ?color=blue&size=M&page=4:

{% querystring page=page.next_page_number %}

Также можно сохранить значение в переменной. Например, если вам нужны несколько ссылок на одну и ту же страницу, определите её как:

{% querystring page=page.next_page_number as next_page %}

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 %} принимает три аргумента: список, который нужно сгруппировать, атрибут для группировки и имя результирующего списка. Здесь мы группируем список cities по атрибуту country и называем результат country_list.

{% regroup %} создаёт список (в данном случае, country_list) из объектов группировки. Объекты группировки — это экземпляры namedtuple() с двумя полями:

  • grouper — элемент, по которому производилась группировка (например, строка “Индия” или “Япония”).
  • list — список всех элементов в этой группе (например, список всех городов с country=’Индия’).

Так как {% regroup %} производит объекты namedtuple(), вы также можете записать предыдущий пример так:

{% regroup cities by country as country_list %}

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

Обратите внимание, что {% regroup %} не сортирует свой ввод! Наш пример полагается на то, что список cities был отсортирован по country в первую очередь. Если список cities не сортировал свои члены по 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 вместо ключей.

resetcycle

Сбрасывает предыдущий тег cycle так, что он перезапускается с первого элемента при следующем появлении. Без аргументов, {% resetcycle %} сбросит последний тег {% cycle %}, определённый в шаблоне.

Пример использования:

{% for coach in coach_list %}
    <h1>{{ coach.name }}</h1>
    {% for athlete in coach.athlete_set.all %}
        <p class="{% cycle 'odd' 'even' %}">{{ athlete.name }}</p>
    {% endfor %}
    {% resetcycle %}
{% endfor %}

Этот пример вернёт следующий HTML:

<h1>Gareth</h1>
<p class="odd">Harry</p>
<p class="even">John</p>
<p class="odd">Nick</p>

<h1>John</h1>
<p class="odd">Andrea</p>
<p class="even">Melissa</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 %}

В этом примере у нас есть как чередующиеся строки нечётных/чётных, так и строка “major” через пять строк. Только цикл из пяти строк сбрасывается при изменении категории.

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.

См. также тег verbatim для альтернативного способа включения этих символов.

url

Возвращает абсолютный путь (URL без доменного имени), соответствующий заданному представлению и необязательным параметрам. Все специальные символы в полученном пути будут закодированы с помощью iri_to_uri().

Это способ вывода ссылок без нарушения принципа DRY, не вводя URL вручную в шаблонах:

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

Первый аргумент — имя URL-шаблона. Это может быть строковый литерал или любая другая переменная контекста. Дополнительные аргументы необязательны и должны быть значениями, разделёнными пробелами, которые будут использованы как аргументы в URL. Приведённый пример показывает передачу позиционных аргументов. В качестве альтернативы можно использовать синтаксис ключевых слов:

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

Не смешивайте позиционный и синтаксис ключевых слов в одном вызове. Все аргументы, необходимые URLconf, должны быть присутствовать.

Например, предположим, у вас есть представление app_views.client, чей URLconf принимает идентификатор клиента (здесь client() — метод внутри файла представлений app_views.py). Строка URLconf может выглядеть так:

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

Если URLconf этой приложения включён в URLconf проекта по пути, такому как:

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

…тогда в шаблоне вы можете создать ссылку на это представление так:

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

Тег шаблона выведет строку /clients/client/123/.

Обратите внимание, что если URL, который вы пытаетесь найти, не существует, будет поднято исключение NoReverseMatch, которое приведёт к отображению страницы ошибки.

Если вам нужно получить URL без отображения, вы можете использовать немного изменённый вызов:

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

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

Область действия переменной, созданной синтаксисом as var, — это {% block %}, в котором появляется тег {% url %}.

Этот синтаксис {% url ... as var %} не вызовет ошибку, если представление отсутствует. На практике вы будете использовать это для связей с представлениями, которые необязательны:

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

Запрещает движку шаблонов рендерить содержимое этого тега блока.

Распространённое применение — разрешить 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 = 0,875; 0,875 * 100 = 87,5, что округляется до 88).

В некоторых случаях вам может потребоваться сохранить результат widthratio в переменной. Это может быть полезно, например, в blocktranslate, как в этом примере:

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

Если value равно 4, то выходным значением будет 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

Форматирует дату в соответствии с заданным форматом.

Использует формат, аналогичный функции date() PHP, с некоторыми отличиями.

Примечание

Эти символы формата не используются в Django за пределами шаблонов. Они были разработаны для совместимости с PHP, чтобы облегчить переход для дизайнеров.

Доступные строки формата:

Символ формата

Описание

Пример вывода

День

d

Число месяца, 2 цифры с ведущими нулями.

'01' по '31'

j

Число месяца без ведущих нулей.

'1' по '31'

D

День недели, текстовое обозначение, 3 буквы.

'Fri'

l

День недели, текстовое обозначение, полное.

'Friday'

S

Послoвие английского порядкового числа для числа месяца, 2 символа.

'st', 'nd', 'rd' или 'th'

w

День недели, цифры без ведущих нулей.

'0' (воскресенье) по '6' (суббота)

z

Номер дня в году.

1 по 366

Неделя

W

Номер недели в году по ISO-8601, недели начинаются с понедельника.

1, 53

Месяц

m

Месяц, 2 цифры с ведущими нулями.

'01' по '12'

n

Месяц без ведущих нулей.

'1' по '12'

M

Месяц, текстовое обозначение, 3 буквы.

'Jan'

b

Месяц, текстовое обозначение, 3 буквы, строчные.

'jan'

E

Альтернативное представление месяца, специфичное для языка, обычно используется для представления длинных дат.

'listopada' (для польского языка, в отличие от 'Listopad')

F

Месяц, текстовое обозначение, полное.

'January'

N

Сокращение месяца в стиле Associated Press. Собственное расширение.

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

t

Количество дней в данном месяце.

28 по 31

Год

y

Год, 2 цифры с ведущими нулями.

'00' по '99'

Y

Год, 4 цифры с ведущими нулями.

'0001', …, '1999', …, '9999'

L

Логическое значение, указывающее, является ли год високосным.

True или False

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

Микросекунды.

000000 по 999999

a

'a.m.' или 'p.m.' (Обратите внимание, что это немного отличается от вывода PHP, потому что это включает точки для соответствия стилю Associated Press.)

'a.m.'

A

'AM' или 'PM'.

'AM'

f

Время в формате 12-часовых часов и минут, с опущенными минутами, если они равны нулю. Собственное расширение.

'1', '1:30'

P

Время в формате 12-часовых часов, минут и «ч.»/«м.», с опущенными минутами, если они равны нулю, и специальными строками «полночь» и «полдень», если применимо. Собственное расширение.

'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, всегда положительное.

-43200 по 43200

Дата/Время

c

Формат ISO 8601. (Примечание: в отличие от других форматеров, таких как «Z», «O» или «r», форматер «c» не добавит смещение часового пояса, если значение является «naive» datetime (см. datetime.tzinfo).

2008-01-02T10:30:00.000123+02:00, или 2008-01-02T10:30:00.000123, если datetime «naive»

r

RFC 5322 формат даты.

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

U

Секунды с эпохи Unix (1 января 1970 г. 00:00:00 UTC).

Например:

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

Если value является объектом datetime (например, результатом datetime.datetime.now()), вывод будет строкой 'Wed 09 Jan 2008'.

Передаваемый формат может быть одним из предопределённых DATE_FORMAT, DATETIME_FORMAT, SHORT_DATE_FORMAT или SHORT_DATETIME_FORMAT, или пользовательским форматом, использующим символы формата, показанные в таблице выше. Обратите внимание, что предопределённые форматы могут отличаться в зависимости от текущего языка.

Предположим, что LANGUAGE_CODE — это, например, "es", тогда для:

{{ value|date:"SHORT_DATE_FORMAT" }}

выводом будет строка "09/01/2008" (символ формата "SHORT_DATE_FORMAT" для es языка, поставляемого с Django, — это "d/m/Y").

При использовании без строки формата используется символ формата DATE_FORMAT. Предполагая те же настройки, что и в предыдущем примере:

{{ value|date }}

выводит 9 de Enero de 2008 (символ формата DATE_FORMAT для es языка — это r'j \d\e F \d\e Y'). Оба «d» и «e» экранированы обратным слэшем, так как иначе каждый из них представляет строку формата, отображающую день и имя часового пояса, соответственно.

Можно комбинировать date с фильтром time для отображения полного представления значения datetime. Например:

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

Если value равно None, вывод будет nothing.

dictsort

Принимает список словарей и возвращает этот список, отсортированный по ключу, указанному в аргументе.

Например:

{{ value|dictsort:"name" }}

Если value равно:

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

то вывод будет:

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

Вы также можете выполнять более сложные операции, такие как:

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

Если books равно:

[
    {"title": "1984", "author": {"name": "George", "age": 45}},
    {"title": "Timequake", "author": {"name": "Kurt", "age": 75}},
    {"title": "Alice", "author": {"name": "Lewis", "age": 33}},
]

то вывод будет:

* Alice (Lewis)
* 1984 (George)
* Timequake (Kurt)

dictsort также может сортировать список списков (или любой другой объект, реализующий __getitem__()) по элементам в указанном индексе. Например:

{{ value|dictsort:0 }}

Если value равно:

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

то вывод будет:

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

Вы должны передать индекс в виде целого числа, а не строки. Следующие примеры приведут к пустому выводу:

{{ values|dictsort:"0" }}

Сортировка по элементам в указанном индексе не поддерживается для словарей.

dictsortreversed

Принимает список словарей и возвращает этот список, отсортированный в обратном порядке по ключу, указанному в аргументе. Это работает точно так же, как и вышеупомянутый фильтр, но возвращаемое значение будет отсортировано в обратном порядке.

divisibleby

Возвращает True, если значение делится на аргумент.

Например:

{{ value|divisibleby:"3" }}

Если value равно 21, вывод будет True.

escape

Экранирует HTML-символы в строке. Конкретно, выполняет следующие замены:

  • < преобразуется в &lt;
  • > преобразуется в &gt;
  • ' (одинарная кавычка) преобразуется в &#x27;
  • " (двойная кавычка) преобразуется в &quot;
  • & преобразуется в &amp;

Применение escape к переменной, к результату которой обычно применяется автоматическое экранирование, приведет только к одному раунду экранирования. Поэтому его безопасно использовать даже в средах с автоматическим экранированием. Если вы хотите выполнить несколько проходов экранирования, используйте фильтр force_escape.

Например, вы можете применить escape к полям, когда autoescape выключен:

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

Цепочки escape с другими фильтрами

Как упоминалось в разделе autoescape, когда фильтры, включая escape, используются в цепочке, это может привести к неожиданным результатам, если предшествующие фильтры помечают потенциально небезопасную строку как безопасную из-за отсутствия экранирования, вызванного тем, что autoescape выключен(off).

В таких случаях цепочка escape не будет повторно экранировать строки, которые уже помечены как безопасные.

Это особенно важно при использовании фильтров, которые работают со последовательностями, например join. Если вам нужно экранировать каждый элемент в последовательности, используйте специальный фильтр escapeseq.

escapejs

Экранирует символы для использования в качестве целочисленной строки JavaScript-литерала, в одинарных или двойных кавычках, как показано ниже. Этот фильтр не делает строку безопасной для использования в «литералах JavaScript-шаблонов» (синтаксис JavaScript с обратной апострофом). Другие способы использования, не указанные выше, не поддерживаются. В целом рекомендуется передавать данные с помощью атрибутов HTML data- или фильтра json_script, а не в встроенном JavaScript.

Например:

<script>
let myValue = '{{ value|escapejs }}'

escapeseq

Применяет фильтр escape к каждому элементу последовательности. Полезно в сочетании с другими фильтрами, которые работают с последовательностями, такими как join. Например:

{% autoescape off %}
    {{ my_list|escapeseq|join:", " }}
{% endautoescape %}

filesizeformat

Форматирует значение как «человекопонятный» размер файла (например, '13 KB', '4.1 MB', '102 bytes' и т.д.).

Например:

{{ value|filesizeformat }}

Если value равно 123456789, вывод будет 117.7 MB.

Размеры файлов и единицы СИ

Строго говоря, 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 (ноль) в качестве аргумента, что округляет число с плавающей точкой до ближайшего целого числа.

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, имеет суффикс g, он будет принудительно группировать числа по разделителю THOUSAND_SEPARATOR для активного языка. Например, когда активный язык — 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

Вывод всегда локализован (независимо от тега {% localize off %}), если аргумент, переданный в floatformat, не имеет суффикса u, что принудительно отключит локализацию. Например, когда активный язык — pl (польский):

value

Шаблон

Вывод

34.23234

{{ value|floatformat:"3" }}

34,232

34.23234

{{ value|floatformat:"3u" }}

34.232

Использование floatformat без аргументов эквивалентно использованию floatformat с аргументом -1.

force_escape

Применяет HTML-экранирование к строке (см. фильтр escape для получения подробностей). Этот фильтр применяется *непосредственно* и возвращает новую, экранированную строку. Это полезно в редких случаях, когда вам нужно многократное экранирование или вы хотите применить другие фильтры к экранированным результатам. Обычно вы хотите использовать фильтр escape.

Например, если вы хотите поймать <p> HTML-элементы, созданные фильтром linebreaks:

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

get_digit

Для целого числа возвращает запрашиваемую цифру, где 1 — самая правая цифра, 2 — вторая справа и т. д. Возвращает исходное значение для некорректного ввода (если вход или аргумент не целое число, или если аргумент меньше 1). В противном случае вывод всегда целое число.

Например:

{{ value|get_digit:"2" }}

Если value равно 123456789, вывод будет 8.

iriencode

Преобразует IRI (международный идентификатор ресурса) в строку, подходящую для включения в URL. Это необходимо, если вы пытаетесь использовать строки, содержащие символы, не входящие в ASCII, в URL.

Безопасно использовать этот фильтр для строки, которая уже прошла через фильтр urlencode.

Например:

{{ value|iriencode }}

Если value равно "?test=I ♥ Django", вывод будет "?test=I%20%E2%99%A5%20Django".

join

Объединяет список со строкой, как в Python str.join(list)

Например:

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

Если value — список ['a', 'b', 'c'], вывод будет строкой "a // b // c".

json_script

Безопасно выводит Python-объект в формате JSON, заключенный в тег <script>, готовый к использованию с JavaScript.

Аргумент: Необязательный HTML-«id» тега <script>.

Например:

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

Если value — словарь {'hello': 'world'}, вывод будет:

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

К данным в JavaScript можно получить доступ следующим образом:

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>

Это совместимо со строгим политикой безопасности содержимого, которая запрещает выполнение сценариев на странице. Она также поддерживает чистое разделение пассивных данных и исполняемого кода.

last

Возвращает последний элемент в списке.

Например:

{{ value|last }}

Если value — список ['a', 'b', 'c', 'd'], вывод будет строкой "d".

length

Возвращает длину значения. Это работает для строк и списков.

Например:

{{ value|length }}

Если value равно ['a', 'b', 'c', 'd'] или "abcd", вывод будет 4.

Для неопределённой переменной фильтр возвращает 0.

linebreaks

Заменяет символы перевода строки в простом тексте соответствующим HTML; одна новая строка становится HTML-разрывом строки (<br>), а новая строка, за которой следует пустая строка, становится разрывом абзаца (</p>).

Например:

{{ value|linebreaks }}

Если value равно Joel\nis a slug, вывод будет <p>Joel<br>is a slug</p>.

linebreaksbr

Преобразует все символы перевода строки в фрагменте простого текста в HTML-разрывы строк (<br>).

Например:

{{ value|linebreaksbr }}

Если value равно Joel\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" }}"

Если value равно Django, вывод будет "Django    ".

lower

Преобразует строку в нижний регистр.

Например:

{{ value|lower }}

Если value равно Totally LOVING this Album!, вывод будет totally loving this album!.

make_list

Возвращает значение, преобразованное в список. Для строки — это список символов. Для целого числа аргумент преобразуется в строку перед созданием списка.

Например:

{{ value|make_list }}

Если value — строка "Joel", вывод будет списком ['J', 'o', 'e', 'l']. Если value равно 123, вывод будет списком ['1', '2', '3'].

phone2numeric

Преобразует номер телефона (возможно, содержащий буквы) в его числовой эквивалент.

Входные данные не обязательно должны быть действительным номером телефона. Эта функция с удовольствием преобразует любую строку.

Например:

{{ value|phone2numeric }}

Если value равно 800-COLLECT, то вывод будет 800-2655328.

pluralize

Возвращает множественное число, если значение не равно 1, '1' или объекту длиной 1. По умолчанию это суффикс 's'.

Пример:

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

Если num_messages равно 1, вывод будет You have 1 message.. Если num_messages равно 2, вывод будет You have 2 messages.

Для слов, требующих суффикса, отличного от 's', можно указать альтернативный суффикс в качестве параметра фильтра.

Пример:

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

Для слов, которые не образуют множественное число простым добавлением суффикса, можно указать как единственное, так и множественное число, разделив их запятой.

Пример:

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

Примечание

Используйте blocktranslate для склонения переведенных строк.

pprint

Обёртка вокруг pprint.pprint() — в основном для отладки.

random

Возвращает случайный элемент из заданного списка.

Например:

{{ value|random }}

Если value — список ['a', 'b', 'c', 'd'], то выводом может быть "b".

rjust

Выравнивает значение по правому краю в поле заданной ширины.

Аргумент: размер поля

Например:

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

Если value равно Django, то вывод будет "    Django".

safe

Отмечает строку как не требующую дальнейшего экранирования HTML перед выводом. Если автоматическое экранирование выключено, этот фильтр не имеет эффекта.

Примечание

Если фильтры применяются последовательно, фильтр, примененный после safe, может сделать содержимое небезопасным снова. Например, следующий код выводит переменную как есть, без экранирования:

{{ var|safe|escape }}

safeseq

Применяет фильтр safe к каждому элементу последовательности. Полезно в сочетании с другими фильтрами, которые работают с последовательностями, такими как join. Например:

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

В этом случае напрямую использовать фильтр safe нельзя, так как он сначала преобразует переменную в строку, а не работает с отдельными элементами последовательности.

slice

Возвращает срез списка.

Использует тот же синтаксис, что и срезы списков в Python. Обратитесь к документации Python для ознакомления.

Пример:

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

Если value равно 10, то вывод будет 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. Если вам нужна более надёжная функция, рассмотрите использование стороннего инструмента для очистки HTML.

time

Форматирует время в соответствии с заданным форматом.

Заданный формат может быть предопределённым TIME_FORMAT или пользовательским, таким же, как и у фильтра date. Обратите внимание, что предопределённый формат зависит от языка.

Например:

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

Если value эквивалентно datetime.datetime.now(), то вывод будет строкой "01:23".

Обратите внимание, что можно экранировать строку формата обратным слешем, если нужно использовать «сырое» значение. В этом примере и «h», и «m» экранированы обратным слешем, так как в противном случае каждый из них — это строка формата, отображающая час и месяц соответственно:

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

Это отобразится как «01ч 23м».

Другой пример:

Предполагая, что LANGUAGE_CODE равно, например, "de", то для:

{{ value|time:"TIME_FORMAT" }}

вывод будет строкой "01:23" (спецификатор формата "TIME_FORMAT" для локали de поставляемой с Django, равен "H:i").

Фильтр time принимает только параметры в строке формата, относящиеся к времени суток, а не к дате. Если вам нужно отформатировать значение date, используйте фильтр date вместо него (или вместе с time, если нужно отобразить полное значение datetime).

Есть одно исключение из этого правила: если передано значение datetime с прикреплённой информацией о часовом поясе (экземпляр часового пояса datetime), фильтр time будет принимать спецификаторы формата, относящиеся к часовому поясу, 'e', 'O', 'T' и 'Z'.

При использовании без строки формата используется спецификатор формата TIME_FORMAT:

{{ value|time }}

это то же самое, что:

{{ value|time:"TIME_FORMAT" }}

timesince

Форматирует дату как время, прошедшее с этой даты (например, «4 дня, 6 часов»).

Принимает необязательный аргумент, который является переменной, содержащей дату, используемую в качестве точки сравнения (без аргумента — точка сравнения — текущий момент). Например, если blog_date — экземпляр даты, представляющий полночь 1 июня 2006 года, и comment_date — экземпляр даты для 8:00 1 июня 2006 года, то следующее вернёт «8 часов»:

{{ blog_date|timesince:comment_date }}

Сравнение даты без смещения и даты со смещением вернёт пустую строку.

Минуты — наименьшая используемая единица, и для любой даты, которая в будущем по отношению к точке сравнения, будет возвращено «0 минут».

timeuntil

Аналогично timesince, за исключением того, что измеряется время от текущего момента до заданной даты или времени. Например, если сегодня 1 июня 2006 года, и conference_date — экземпляр даты 29 июня 2006 года, то {{ conference_date|timeuntil }} вернёт «4 недели».

Принимает необязательный аргумент, который является переменной, содержащей дату, используемую в качестве точки сравнения (вместо текущего момента). Если from_date содержит 22 июня 2006 года, то следующее вернёт «1 неделя»:

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

Аналогично truncatechars, за исключением того, что он учитывает HTML-теги. Любые открытые в строке теги, которые не закрыты до точки обрезки, закрываются сразу после обрезки.

Например:

{{ value|truncatechars_html:7 }}

Если value равно "<p>Joel is a slug</p>", результат будет "<p>Joel i…</p>".

Новые строки в HTML-содержимом сохранятся.

Размер входной строки

Обработка больших, потенциально некорректных HTML-строк может быть ресурсоемкой и повлиять на производительность сервиса. truncatechars_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-содержимом сохранятся.

Размер входной строки

Обработка больших, потенциально некорректных HTML-строк может быть ресурсоемкой и повлиять на производительность сервиса. truncatewords_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://djangocon.eu будет преобразовано, а djangocon.eu — нет.

Также поддерживает ссылки только с доменом, заканчивающиеся одним из оригинальных доменных имен верхнего уровня (.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. Если autoescape равно True, текст ссылки и URL-адреса будут экранированы с помощью встроенного фильтра Django escape. Значение по умолчанию для autoescape равно True.

Примечание

Если urlize применяется к тексту, который уже содержит HTML-разметку, или к адресам электронной почты, содержащим одинарные кавычки ('), результат не будет ожидаемым. Применяйте этот фильтр только к простому тексту.

Предупреждение

Использование urlize или urlizetrunc может привести к снижению производительности, что может стать серьёзной проблемой при применении к управляемым пользователем значениям, таким как содержимое, хранящееся в TextField. Вы можете использовать truncatechars для ограничения таких входных данных:

{{ value|truncatechars:500|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 }}

Если value равно Joel is a slug, результатом будет:

Joel
is a
slug

yesno

Преобразует значения для True, False и (необязательно) None в строки «да», «нет», «возможно» или пользовательское отображение, переданное в виде списка через запятую, и возвращает одну из этих строк в зависимости от значения:

Например:

{{ 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 в False, если отображение для None не задано)

Международные теги и фильтры

Django предоставляет теги и фильтры шаблонов для управления каждым аспектом международной поддержки в шаблонах. Они позволяют точно контролировать переводы, форматирование и преобразования часовых поясов.

i18n

Эта библиотека позволяет указывать переводимый текст в шаблонах. Для его активации установите USE_I18N на True, а затем загрузите его с помощью {% load i18n %}.

См. Международная поддержка: в коде шаблона.

l10n

Эта библиотека обеспечивает контроль над локализованными значениями в шаблонах. Вам нужно только загрузить библиотеку с помощью {% load l10n %}.

См. Управление локализацией в шаблонах.

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 установлено, тег будет обслуживать файлы, используя метод url() хранилища, указанного в staticfiles в STORAGES. Например:

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

Он также может использовать стандартные переменные контекста, например, предполагая, что переменная user_stylesheet передаётся в шаблон:

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

Если вы хотите получить статический URL без его отображения, вы можете использовать немного другой вызов:

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

Использование шаблонов 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_prefix, get_media_prefix заполняет переменную шаблона префиксом медиа MEDIA_URL, например:

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

Хранение значения в атрибуте данных гарантирует его надлежащую экранировку, если мы хотим использовать его в контексте JavaScript.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/ref/templates/builtins/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API