Встроенные теги и фильтры шаблонов
В этом документе описаны встроенные теги и фильтры шаблонов Django. Если доступна автоматическая документация, рекомендуется воспользоваться ею: в ней также содержится документация по всем установленным пользовательским тегам и фильтрам.
Справочник встроенных тегов
autoescape
Управляет текущим поведением автоматического экранирования. Этот тег принимает в качестве аргумента on или off; от этого зависит, будет ли автоматическое экранирование применяться внутри блока. Блок завершается закрывающим тегом endautoescape.
Пример использования:
{% autoescape on %}
{{ body }}
{% endautoescape %}
При включенном автоматическом экранировании HTML-экранирование применяется ко всему содержимому, полученному из переменных, перед добавлением результата в вывод (но после применения фильтров). Это равносильно ручному применению фильтра escape к каждой переменной.
Исключение составляют переменные, уже помеченные как «безопасные» для экранирования. Переменные могут быть помечены как «безопасные» кодом, который заполнил переменную, при помощи фильтров safe или escape либо потому, что они являются результатом предыдущего фильтра, пометившего строку как «безопасную».
В области с отключенным автоматическим экранированием цепочки фильтров, в том числе escape, могут приводить к неожиданным (но описанным в документации) результатам, например:
{% autoescape off %}
{{ my_list|join:", "|escape }}
{% endautoescape %}
Приведенный выше код выведет объединенные элементы my_list без экранирования. Это происходит потому, что сначала в цепочке фильтров к my_list применяется фильтр join (без экранирования каждого элемента, поскольку 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 %}
Чтобы при следующем обнаружении тег {% cycle %} начинался с первого значения, используйте тег resetcycle.
debug
Выводит множество отладочной информации, включая текущий контекст и импортированные модули. При значении False у параметра DEBUG тег {% debug %} ничего не выводит.
extends
Указывает, что этот шаблон наследует родительский шаблон.
Этот тег можно использовать двумя способами:
-
{% extends "base.html" %}(в кавычках) использует буквальное значение"base.html"в качестве имени родительского шаблона. -
{% extends variable %}использует значениеvariable. Если переменная содержит строку, Django использует эту строку как имя родительского шаблона. Если переменная содержит объектTemplate, Django использует этот объект как родительский шаблон.
Подробнее см. в разделе Наследование шаблонов.
Обычно имя шаблона указывается относительно корневого каталога загрузчика шаблонов. Строковый аргумент также может быть относительным путем, начинающимся с ./ или ../. Например, предположим, что структура каталогов выглядит так:
dir1/
template.html
base2.html
my/
base3.html
base1.html
В template.html допустимы следующие пути:
{% extends "./base2.html" %}
{% extends "../base1.html" %}
{% extends "./my/base3.html" %}
filter
Применяет к содержимому блока один или несколько фильтров. Несколько фильтров можно указать через вертикальную черту; у фильтров могут быть аргументы, как и в синтаксисе переменных.
Обратите внимание, что блок включает весь текст между тегами 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 задается несколько переменных, доступных внутри цикла:
Переменная | Описание |
|---|---|
| Текущая итерация цикла (нумерация начинается с 1) |
| Текущая итерация цикла (нумерация начинается с 0) |
| Количество итераций до конца цикла (нумерация начинается с 1) |
| Количество итераций до конца цикла (нумерация начинается с 0) |
| True, если это первая итерация цикла |
| True, если это последняя итерация цикла |
| Длина цикла |
| Для вложенных циклов — цикл, содержащий текущий |
Добавлена переменная forloop.length.
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 %}
Сложные выражения
Все перечисленное выше можно объединять в сложные выражения. Для таких выражений важно знать, как группируются операторы при вычислении выражения, то есть знать правила приоритета. Приоритет операторов от низшего к высшему:
orandnotin-
==,!=,<,>,<=,>=
(Правила полностью совпадают с 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 %} используется внутри цикла. У него есть два варианта применения.
-
Сравнивает содержимое собственного отрендеренного блока с предыдущим состоянием и выводит его, только если оно изменилось. Например, этот код выводит список дней, отображая месяц только при его изменении:
<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 %} -
Если передана одна или несколько переменных, проверяет, изменилось ли значение какой-либо из них. Например, следующий код выводит дату при каждом ее изменении, а час — при изменении часа или даты:
{% 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», а не как «разобрать этот подшаблон и включить его содержимое так, будто оно является частью родительского». Это означает, что включенные шаблоны не имеют общего состояния — каждое включение представляет собой полностью независимый процесс рендеринга.
Блоки вычисляются до включения. Это означает, что шаблон, включающий блоки из другого шаблона, будет содержать блоки, которые уже вычислены и отрендерены, а не блоки, которые могут быть переопределены, например, наследующим шаблоном.
load
Загружает набор пользовательских тегов шаблонов.
Например, следующий шаблон загрузит все теги и фильтры, зарегистрированные в somelibrary и otherlibrary, расположенных в пакете package:
{% load somelibrary package.otherlibrary %}
Также можно выборочно загрузить отдельные фильтры или теги из библиотеки с помощью аргумента from. В этом примере из somelibrary будут загружены теги/фильтры с именами foo и bar:
{% load foo bar from somelibrary %}
Подробнее см. в разделе Пользовательские библиотеки тегов и фильтров.
lorem
Выводит случайный латинский текст «lorem ipsum». Полезен для предоставления примеров данных в шаблонах.
Использование:
{% lorem [count] [method] [random] %}
Тег {% lorem %} можно использовать с нулем, одним, двумя или тремя аргументами. Аргументы:
Аргумент | Описание |
|---|---|
| Число (или переменная), задающее количество генерируемых абзацев или слов (по умолчанию — 1). |
|
|
| Слово |
Примеры:
-
{% 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 %}
partial
Рендерит фрагмент шаблона, определенный с помощью partialdef, вставляя соответствующий фрагмент в это место.
Использование:
{% partial partial_name %}
Аргумент partial_name — это имя фрагмента шаблона, который нужно отрендерить.
В следующем примере определяется фрагмент с именем button, а затем он рендерится три раза:
{% partialdef button %}
<button>Submit</button>
{% endpartialdef %}
{% partial button %}
{% partial button %}
{% partial button %}
partialdef
Определяет повторно используемый фрагмент шаблона, который можно несколько раз отрендерить в одном шаблоне или напрямую получить через загрузку или включение шаблона.
Использование:
{% partialdef partial_name %}
{# Reusable content. #}
{% endpartialdef %}
Аргумент partial_name обязателен и должен быть допустимым идентификатором шаблона.
В следующем примере определяется новый фрагмент с именем card:
{% partialdef card %}
<div class="card">
<h3>{{ title }}</h3>
<p>{{ content }}</p>
</div>
{% endpartialdef %}
Затем этот фрагмент можно отрендерить с помощью тега partial:
{% partial card %}
{% partial card %}
Чтобы сразу отрендерить фрагмент в этом месте, используйте параметр inline. Фрагмент при этом сохраняется и может быть повторно использован позднее.
querystring
Выводит форматированную строку запроса с кодированием URL на основе переданных параметров.
Этот тег принимает позиционные аргументы, которые должны быть отображениями (например, QueryDict или dict). Если позиционные аргументы не переданы, для построения строки запроса по умолчанию используется request.GET.
Позиционные аргументы обрабатываются последовательно, а именованные аргументы рассматриваются как пары ключ-значение и применяются последними. Более поздние аргументы имеют приоритет над предыдущими, поэтому в итоговом результате отражаются самые последние пары.
Результат всегда включает в себя начальный "?", поскольку этот тег в основном используется для ссылок, а пустой результат может помешать ожидаемой перезагрузке страницы.
Использование 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.
Задание элементов
{% 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, при этом структура списка в строке запроса сохраняется.
Настройка базового QueryDict
В качестве позиционных аргументов можно передать пользовательские экземпляры QueryDict или dict, чтобы заменить request.GET. Если передано несколько аргументов, пары ключ-значение из более поздних аргументов имеют приоритет над парами из предыдущих.
Например, если my_query_dict равно <QueryDict: {'color': ['blue'], 'size':
['S']}>, а my_dict равно {'color': 'orange', 'fabric': 'silk', 'type':
'dress'}, результатом будет ?color=orange&size=S&fabric=silk.
{% querystring my_query_dict my_dict size="S" type=None %}
Если все ключи удалены путём присвоения им значения None, результатом будет ?:
{% querystring my_query_dict my_dict color=None size=None fabric=None type=None %}
Аналогично, если все позиционные аргументы пусты и именованные аргументы не добавляют новых параметров, результатом также будет ?.
Добавлена поддержка нескольких позиционных аргументов-отображений.
Динамическое использование
Распространённый пример использования этого тега — сохранение текущей строки запроса при отображении страницы с результатами и добавление ссылок на следующие и предыдущие страницы. Например, если сейчас открыта страница 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=’India’).
Поскольку {% regroup %} создаёт объекты namedtuple(), предыдущий пример можно также записать так:
{% regroup cities by country as country_list %}
<ul>
{% for country, local_cities in country_list %}
<li>{{ country }}
<ul>
{% for city in local_cities %}
<li>{{ city.name }}: {{ city.population }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
Обратите внимание, что {% regroup %} не упорядочивает входные данные! Наш пример предполагает, что список cities изначально упорядочен по country. Если список cities не упорядочен по 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
Сбрасывает ранее заданный цикл, чтобы при следующем использовании он начинался с первого элемента. Если аргументы не указаны, {% 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 %}
В этом примере есть чередующиеся нечётные и чётные строки, а также «главная» строка через каждые пять строк. При смене категории сбрасывается только пятистрочный цикл.
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 %} можно вывести одну из комбинаций символов тега шаблона.
Аргумент указывает, какой фрагмент шаблона нужно вывести:
Аргумент | Вывод |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Пример использования:
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 %}
Не смешивайте позиционный и именованный синтаксис в одном вызове. Необходимо указать все аргументы, требуемые конфигурацией URL.
Например, предположим, что у вас есть представление app_views.client, конфигурация URL которого принимает идентификатор клиента (здесь client() — это метод в файле представлений app_views.py). Строка конфигурации URL может выглядеть так:
path("client/<int:id>/", app_views.client, name="app-views-client")
Если конфигурация URL этого приложения включена в конфигурацию URL проекта по такому пути:
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 = .875; .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
Удаляет из заданной строки все вхождения аргумента.
Например:
{{ value|cut:" " }}
Если value равно "String with spaces", результатом будет "Stringwithspaces".
date
Форматирует дату в соответствии с заданным форматом.
Использует формат, похожий на формат функции date() в PHP, но с некоторыми отличиями.
Примечание
Эти символы форматирования не используются в Django вне шаблонов. Они были разработаны совместимыми с PHP, чтобы упростить переход для дизайнеров.
Доступные строки формата:
Символ форматирования | Описание | Пример результата |
|---|---|---|
День | ||
| День месяца, две цифры с ведущими нулями. | от |
| День месяца без ведущих нулей. | от |
| День недели, текстовое обозначение из 3 букв. |
|
| День недели, полное текстовое обозначение. |
|
| Английский порядковый суффикс дня месяца, 2 символа. |
|
| День недели, цифра без ведущих нулей. |
|
| День года. | от |
Неделя | ||
| Номер недели года по ISO-8601; неделя начинается в понедельник. |
|
Месяц | ||
| Месяц, две цифры с ведущими нулями. | от |
| Месяц без ведущих нулей. | от |
| Месяц, текстовое обозначение из 3 букв. |
|
| Месяц, текстовое обозначение из 3 букв в нижнем регистре. |
|
| Альтернативное представление месяца, зависящее от локали и обычно используемое в полной дате. |
|
| Месяц, полное текстовое обозначение. |
|
| Сокращённое название месяца в стиле Associated Press. Проприетарное расширение. |
|
| Количество дней в заданном месяце. | от |
Год | ||
| Год, две цифры с ведущими нулями. | от |
| Год, четыре цифры с ведущими нулями. |
|
| Логическое значение, указывающее, является ли год високосным. |
|
| Год нумерации недель по ISO-8601, соответствующий номеру недели по ISO-8601 (W), где используются високосные недели. Более распространённый формат года см. в описании Y. |
|
Время | ||
| Час в 12-часовом формате без ведущих нулей. | от |
| Час в 24-часовом формате без ведущих нулей. | от |
| Час в 12-часовом формате. | от |
| Час в 24-часовом формате. | от |
| Минуты. | от |
| Секунды, две цифры с ведущими нулями. | от |
| Микросекунды. | от |
|
|
|
|
|
|
| Время в 12-часовом формате — часы и минуты; минуты опускаются, если они равны нулю. Проприетарное расширение. |
|
| Время в 12-часовом формате — часы, минуты и «a.m.»/«p.m.»; минуты опускаются, если они равны нулю, а в особых случаях используются строки «midnight» и «noon». Проприетарное расширение. |
|
Часовой пояс | ||
| Название часового пояса. Может иметь любой формат или возвращать пустую строку в зависимости от даты и времени. |
|
| Признак действия летнего времени. |
|
| Разница с временем по Гринвичу в часах. |
|
| Часовой пояс этой машины. |
|
| Смещение часового пояса в секундах. Для часовых поясов к западу от UTC смещение всегда отрицательное, а к востоку от UTC — всегда положительное. | от |
Дата и время | ||
| Формат ISO 8601. (Примечание: в отличие от других форматтеров, таких как «Z», «O» или «r», форматтер «c» не добавляет смещение часового пояса, если значение — наивный объект datetime (см. |
|
| Дата в формате RFC 5322. |
|
| Количество секунд с начала эпохи 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 в строке. В частности, выполняются следующие замены:
-
<преобразуется в< -
>преобразуется в> -
'(одинарная кавычка) преобразуется в' -
"(двойная кавычка) преобразуется в" -
&преобразуется в&
Применение 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
Если аргумент не указан, округляет число с плавающей точкой до одного десятичного знака, но только если нужно отобразить дробную часть. Например:
| Шаблон | Результат |
|---|---|---|
|
|
|
|
|
|
|
|
|
Если аргументом является целое число, floatformat округляет число до указанного количества десятичных знаков. Например:
| Шаблон | Результат |
|---|---|---|
|
|
|
|
|
|
|
|
|
Особенно полезно передавать в качестве аргумента 0 (ноль): число с плавающей точкой будет округлено до ближайшего целого.
| Шаблон | Результат |
|---|---|---|
|
|
|
|
|
|
|
|
|
Если аргумент, переданный в floatformat, отрицательный, число будет округлено до указанного количества десятичных знаков, но только если нужно отобразить дробную часть. Например:
| Шаблон | Результат |
|---|---|---|
|
|
|
|
|
|
|
|
|
Если аргумент, переданный в floatformat, имеет суффикс g, числа будут группироваться с помощью THOUSAND_SEPARATOR, заданного для активной локали. Например, если активна локаль en (английская):
| Шаблон | Результат |
|---|---|---|
|
|
|
|
|
|
|
|
|
Результат всегда локализуется (независимо от тега {% localize off %}), если только аргумент, переданный в floatformat, не имеет суффикс u, который отключает локализацию. Например, если активна локаль pl (польская):
| Шаблон | Результат |
|---|---|---|
|
|
|
|
|
|
Использование floatformat без аргумента эквивалентно использованию floatformat с аргументом -1.
force_escape
Применяет к строке экранирование HTML (подробности см. в описании фильтра escape). Этот фильтр применяется немедленно и возвращает новую экранированную строку. Он полезен в редких случаях, когда требуется экранирование в несколько проходов или применение других фильтров к экранированным результатам. Обычно следует использовать фильтр escape.
Например, если нужно перехватить HTML-элементы <p>, созданные фильтром linebreaks:
{% autoescape off %}
{{ body|linebreaks|force_escape }}
{% endautoescape %}
get_digit
Для целого числа возвращает указанную цифру: 1 — крайняя справа, 2 — вторая справа и т. д. При некорректном вводе возвращает исходное значение (если значение или аргумент не является целым числом либо аргумент меньше 1). В остальных случаях результат всегда является целым числом.
Например:
{{ value|get_digit:"2" }}
Если value равно 123456789, результатом будет 8.
iriencode
Преобразует IRI (интернационализированный идентификатор ресурса) в строку, пригодную для включения в URL. Это необходимо, если вы хотите использовать в URL строки, содержащие символы, отличные от ASCII.
Этот фильтр можно безопасно применять к строке, уже обработанной фильтром urlencode.
Например:
{{ value|iriencode }}
Если value равно "?test=I ♥ Django", результатом будет "?test=I%20%E2%99%A5%20Django".
join
Объединяет элементы списка с помощью строки, как это делает функция str.join(list) в Python.
Например:
{{ 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>&'}, результат будет таким:
<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, за исключением того, что начальный символ «%» опускается.
Например:
{{ 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" }}
Результат будет выглядеть так: «01h 23m».
Ещё один пример:
Предположим, что 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 — экземпляр даты для 08:00 1 июня 2006 года, следующий код вернёт «8 часов»:
{{ blog_date|timesince:comment_date }}
При сравнении наивных и учитывающих смещение часового пояса объектов datetime возвращается пустая строка.
Минимальная единица измерения — минута; для любой даты, которая находится в будущем относительно точки сравнения, будет возвращено «0 минут».
timeuntil
Работает аналогично timesince, но измеряет время от текущего момента до заданной даты или даты и времени. Например, если сегодня 1 июня 2006 года, а conference_date — экземпляр даты со значением 29 июня 2006 года, то {{ conference_date|timeuntil }} вернёт «4 недели».
Принимает необязательный аргумент — переменную с датой, используемой в качестве точки сравнения (вместо текущего времени). Если from_date содержит дату 22 июня 2006 года, следующий код вернёт «1 неделю»:
{{ conference_date|timeuntil:from_date }}
При сравнении наивных и учитывающих смещение часового пояса объектов datetime возвращается пустая строка.
Минимальная единица измерения — минута; для любой даты, которая находится в прошлом относительно точки сравнения, будет возвращено «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>
Устарело с версии 6.0: Протоколом по умолчанию, если он не указан, вместо HTTP станет HTTPS в Django 7.0. Поэтому результат будет таким:
Check out <a href="https://www.djangoproject.com" rel="nofollow">www.djangoproject.com</a>
Установите переходный параметр URLIZE_ASSUME_HTTPS в значение True, чтобы использовать HTTPS в течение цикла выпуска Django 6.x.
Помимо веб-ссылок, 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-разметку, или к адресам электронной почты с одинарными кавычками ('), результат будет некорректным. Применяйте этот фильтр только к обычному тексту.
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>
Устарело с версии 6.0: Протоколом по умолчанию, если он не указан, вместо HTTP станет HTTPS в Django 7.0. Поэтому результат будет таким:
Check out <a href="https://www.djangoproject.com" rel="nofollow">www.djangoproj…</a>
Установите переходный параметр URLIZE_ASSUME_HTTPS в значение True, чтобы использовать HTTPS в течение цикла выпуска Django 6.x.
Как и 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 со строками «yes», «no», «maybe» или пользовательским соответствием, переданным в виде списка, разделённого запятыми, и возвращает одну из этих строк в зависимости от значения:
Например:
{{ value|yesno:"yeah,no,maybe" }}
Значение | Аргумент | Результат |
|---|---|---|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
Теги и фильтры интернационализации
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?
Информацию об использовании тега static с Jinja2 см. в разделе 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 %}">
Сохраняя значение в атрибуте data, мы гарантируем его корректное экранирование при использовании в контексте JavaScript.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/templates/builtins/