Встроенные теги и фильтры шаблонов
Справочник по встроенным тегам
autoescape
Управляет текущим поведением автоматической экранизации. Этот тег принимает on или off в качестве аргумента, что определяет, включена ли автоматическая экранизация внутри блока. Блок закрывается тегом endautoescape.
При включенной автоматической экранизации все содержимое переменных проходит HTML-экранирование перед выводом результата (но после применения любых фильтров). Это эквивалентно ручному применению фильтра escape к каждой переменной.
Исключение составляют переменные, уже помеченные как «безопасные» для экранизации, либо кодом, который заполнил переменную, либо потому, что к ним были применены фильтры safe или escape.
Пример использования:
{% autoescape on %}
{{ body }}
{% endautoescape %}
block
Определяет блок, который может быть переопределён дочерними шаблонами. Подробнее см. Наследование шаблонов.
comment
Игнорирует всё между {% comment %} и {% endcomment %}. В первом теге может быть добавлено необязательное примечание. Например, это полезно для комментирования кода, объясняющего, почему код был отключен.
Пример использования:
<p>Rendered text with {{ pub_date|date:"c" }}</p>
{% comment "Optional note" %}
<p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}
comment теги не могут быть вложены.
csrf_token
Этот тег используется для защиты от CSRF, как описано в документации по Защиты от межсайтовых поддельных запросов.
cycle
Выводит один из своих аргументов каждый раз, когда этот тег встречается. Первый аргумент выводится при первом столкновении, второй - при втором и так далее. После того, как все аргументы исчерпаны, тег циклически возвращается к первому аргументу и выводит его снова.
Этот тег особенно полезен в цикле:
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
Первый шаг выводит HTML, который ссылается на класс row1, второй на row2, третий на row1 и так далее для каждой итерации цикла.
Вы также можете использовать переменные. Например, если у вас есть две переменные шаблона, 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. Следующий шаблон выведет *ничего*, даже если второй вызов {% cycle %} не указывает silent.
{% cycle 'row1' 'row2' as rowcolors silent %}
{% cycle rowcolors %}
Вы можете использовать тег resetcycle для того, чтобы тег {% cycle %} перезапустился со своего первого значения, когда он снова встретится.
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
Фильтры содержимого блока через один или несколько фильтров. Несколько фильтров могут быть указаны с помощью символа '|' (pipe), а фильтры могут иметь аргументы, точно так же, как и в синтаксисе переменных.
Обратите внимание, что блок включает *всё* текст между 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 %}
Вы также можете использовать строковый литерал в качестве значения по умолчанию в случае, если все переданные переменные имеют значение False:
{% firstof var1 var2 var3 "fallback value" %}
Этот тег автоматически экранирует значения переменных. Вы можете отключить автоматическую экранизацию с помощью:
{% autoescape off %}
{% firstof var1 var2 var3 "<strong>fallback value</strong>" %}
{% endautoescape %}
Или, если экранироваться должны только некоторые переменные, вы можете использовать:
{% firstof var1 var2|safe var3 "<strong>fallback value</strong>"|safe %}
Вы можете использовать синтаксис {% firstof var1 var2 var3 as value %} для хранения вывода в переменной.
for
Проходит по каждому элементу в массиве, делая элемент доступным в переменной контекста. Например, чтобы отобразить список спортсменов, предоставленных в athlete_list.
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
Вы можете пройти по списку в обратном порядке, используя {% for obj in list reversed %}.
Если вам нужно пройти по списку списков, вы можете распаковать значения в каждом подсписке в отдельные переменные. Например, если в вашем контексте есть список координат (x, y) с именем points, вы можете использовать следующее, чтобы вывести список точек:
{% for x, y in points %}
There is a point at {{ x }},{{ y }}
{% endfor %}
Это также может быть полезно, если вам нужно получить доступ к элементам в словаре. Например, если в вашем контексте был словарь data, следующее отобразит ключи и значения словаря:
{% for key, value in data.items %}
{{ key }}: {{ value }}
{% endfor %}
Помните, что для оператора точки поиск по ключу словаря имеет приоритет над поиском по методу. Таким образом, если в словаре 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 | Истина, если это первая итерация цикла |
forloop.last | Истина, если это последняя итерация цикла |
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 %}
Сложные выражения
Всё вышеперечисленное можно комбинировать в сложные выражения. Для таких выражений важно понимать, как операторы группируются при оценке выражения — то есть правила приоритета. Приоритет операторов, от низшего к высшему, следующий:
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. В этом примере будут загружены теги/фильтры 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 %}
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>José Mourinho</h1> <p class="odd">Thibaut Courtois</p> <p class="even">John Terry</p> <p class="odd">Eden Hazard</p> <h1>Carlo Ancelotti</h1> <p class="odd">Manuel Neuer</p> <p class="even">Thomas Müller</p>
Обратите внимание, как первый блок заканчивается class="odd" и новый начинается с class="odd". Без тега {% resetcycle %} второй блок начинался бы с class="even".
Вы также можете сбросить теги цикла с именами:
{% for item in list %}
<p class="{% cycle 'odd' 'even' as stripe %} {% cycle 'major' 'minor' 'minor' 'minor' 'minor' as tick %}">
{{ item.data }}
</p>
{% ifchanged item.category %}
<h1>{{ item.category }}</h1>
{% if not forloop.first %}{% resetcycle tick %}{% endif %}
{% endifchanged %}
{% endfor %}
В этом примере у нас есть как чередующиеся строки нечётных/чётных строк, так и строка «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
Удаляет все значения аргумента из заданной строки.
Например:
{{ 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 | Английский порядковый суффикс для дня месяца, 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-часовых часов, минут и 'a.m.'/'p.m.', с опущенными минутами, если они нулевые, и специальными строками 'полночь' и 'полдень', если применимо. Собственное расширение. |
'1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.'
|
| Временная зона | ||
e | Имя временной зоны. Может быть в любом формате или возвращать пустую строку, в зависимости от даты и времени. |
'', 'GMT', '-500', 'US/Eastern', и т.д. |
I | Летнее время, действует или нет. |
'1' или '0'
|
O | Отклонение от Гринвича в часах. | '+0200' |
T | Временная зона этого компьютера. |
'EST', 'MDT'
|
Z | Смещение часового пояса в секундах. Смещение для часовых поясов к западу от UTC всегда отрицательное, а для часовых поясов к востоку от UTC всегда положительное. |
-43200 до 43200
|
| Дата/Время | ||
c | Формат ISO 8601. (Примечание: в отличие от других форматеров, таких как «Z», «O» или «r», форматер «c» не добавит смещение часового пояса, если значение является наивной датой и временем (см. datetime.tzinfo). |
2008-01-02T10:30:00.000123+02:00, или 2008-01-02T10:30:00.000123 если дата и время являются наивными |
r | Формат даты по RFC 5322. | 'Thu, 21 Dec 2000 16:01:07 +0200' |
U | Секунды с эпохи Unix (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, или пользовательским форматом, который использует спецификаторы формата, показанные в таблице выше. Обратите внимание, что предопределённые форматы могут отличаться в зависимости от текущей локали.
Предполагая, что USE_L10N равно True и 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, если нужно fallback для пустых строк.
Например:
{{ 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 %}
escapejs
Экранирует символы для использования в строках JavaScript. Это не делает строку безопасной для использования в HTML или шаблонах JavaScript, но защищает вас от синтаксических ошибок при использовании шаблонов для генерации JavaScript/JSON.
Например:
{{ value|escapejs }}
Если value равно "testing\r\njavascript 'string\" <b>escaping</b>", выходной результат будет "testing\\u000D\\u000Ajavascript \\u0027string\\u0022 \\u003Cb\\u003Eescaping\\u003C/b\\u003E".
filesizeformat
Форматирует значение как «человеко-читаемое» размер файла (т. е. '13 KB', '4.1 MB', '102 bytes', и т. д.).
Например:
{{ value|filesizeformat }}
Если 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.
Добавлен суффикс g для принудительной группировки по разделителям тысяч.
Фильтр шаблона floatformat больше не зависит от настройки USE_L10N и всегда возвращает локализованный вывод.
Добавлен суффикс u для принудительного отключения локализации.
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. Это необходимо, если вы пытаетесь использовать строки, содержащие символы, не входящие в ASCII, в URL.
Безопасно использовать этот фильтр для строки, которая уже прошла через фильтр urlencode.
Например:
{{ value|iriencode }}
Если value равно "?test=1&me=2", выходной результат будет "?test=1&me=2".
join
Объединяет список со строкой, как в Python’s 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>&'}, то результатом будет:
<script id="hello-data" type="application/json">{"hello": "world\\u003C/script\\u003E\\u0026amp;"}</script>
Это совместимо со строгим Content Security Policy, который запрещает выполнение скриптов на странице. Также сохраняется чёткое разделение между пассивными данными и исполняемым кодом.
last
Возвращает последний элемент в списке.
Например:
{{ value|last }}
Если value — это список ['a', 'b', 'c', 'd'], то результатом будет строка "d".
length
Возвращает длину значения. Это работает как для строк, так и для списков.
Например:
{{ value|length }}
Если value равно ['a', 'b', 'c', 'd'] или "abcd", то результатом будет 4.
Фильтр возвращает 0 для неопределённой переменной.
length_is
Возвращает True, если длина значения равна аргументу, или False, в противном случае.
Например:
{{ value|length_is:"4" }}
Если value равно ['a', 'b', 'c', 'd'] или "abcd", то результатом будет True.
linebreaks
Заменяет переносы строк в простом тексте соответствующими HTML-тегами; одиночный символ новой строки становится HTML-переносом строки (<br>), а новая строка, за которой следует пустая строка, — переносом абзаца (</p>).
Например:
{{ value|linebreaks }}
Если 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. См. https://diveinto.org/python3/native-datatypes.html#slicinglists для введения.
Пример:
{{ some_list|slice:":2" }}
Если some_list равно ['a', 'b', 'c'], то результатом будет ['a', 'b'].
slugify
Преобразует в ASCII. Преобразует пробелы в дефисы. Удаляет символы, которые не являются алфавитно-цифровыми, символами подчёркивания или дефисами. Преобразует в нижний регистр. Также удаляет начальные и конечные пробелы.
Например:
{{ value|slugify }}
Если value равно "Joel is a slug", то результатом будет "joel-is-a-slug".
stringformat
Форматирует переменную в соответствии с аргументом — строковым спецификатором форматирования. Этот спецификатор использует синтаксис форматирования строк в стиле printf, за исключением того, что ведущая «%» опускается.
Например:
{{ value|stringformat:"E" }}
Если value равно 10, то результатом будет 1.000000E+01.
striptags
Например:
{{ value|striptags }}
Если value равно "<b>Joel</b> <button>is</button> a <span>slug</span>", то результатом будет "Joel is a slug".
Гарантии безопасности нет
Обратите внимание, что striptags не гарантирует, что результат будет безопасен для HTML, особенно с некорректными входными данными. Поэтому НИКОГДА не применяйте фильтр safe к выводу striptags. Если вам нужна более надёжная функция, вы можете использовать библиотеку Python bleach, в частности, её метод clean.
time
Форматирует время в соответствии с заданным форматом.
Заданный формат может быть предопределённым TIME_FORMAT, или пользовательским форматом, аналогично фильтру date. Обратите внимание, что предопределённый формат зависит от локали.
Например:
{{ value|time:"H:i" }}
Если value эквивалентно datetime.datetime.now(), то результатом будет строка "01:23".
Обратите внимание, что вы можете экранировать строку формата обратной косой чертой, если хотите использовать «сырое» значение. В этом примере как «h», так и «m» экранированы обратной косой чертой, так как в противном случае каждый представляет собой формат, отображающий час и месяц соответственно:
{% value|time:"H\h i\m" %}
Это отобразится как «01ч 23м».
Другой пример:
Предполагая, что USE_L10N равно True и 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 }}
Сравнение даты без смещения и даты со смещением вернёт пустую строку.
Минуты являются наименьшей используемой единицей, а «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|truncatechars:7 }}
Если 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-содержимом будут сохранены.
truncatewords
Усекает строку после определённого числа слов.
Аргумент: Число слов, после которых усекать.
Например:
{{ value|truncatewords:2 }}
Если value — "Joel is a slug", результат будет "Joel is …".
Новые строки внутри строки будут удалены.
truncatewords_html
Аналогично truncatewords, но учитывает HTML-теги. Любые теги, которые открыты в строке и не закрыты до точки усечения, закрываются сразу после усечения.
Это менее эффективно, чем truncatewords, поэтому следует использовать только при работе с HTML-текстом.
Например:
{{ value|truncatewords_html:2 }}
Если value — "<p>Joel is a slug</p>", результат будет "<p>Joel is …</p>".
Новые строки в HTML-содержимом будут сохранены.
unordered_list
Рекурсивно принимает самовложенный список и возвращает HTML-список без маркированных элементов — БЕЗ открывающих и закрывающих тегов <ul>.
Предполагается, что список имеет правильный формат. Например, если var содержит ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']], то {{ var|unordered_list }} вернёт:
<li>States
<ul>
<li>Kansas
<ul>
<li>Lawrence</li>
<li>Topeka</li>
</ul>
</li>
<li>Illinois</li>
</ul>
</li>
upper
Преобразует строку в верхний регистр.
Например:
{{ value|upper }}
Если value — "Joel is a slug", результат будет "JOEL IS A SLUG".
urlencode
Экранирует значение для использования в URL.
Например:
{{ value|urlencode }}
Если value — "https://www.example.org/foo?a=b&c=d", результат будет "https%3A//www.example.org/foo%3Fa%3Db%26c%3Dd".
Можно указать необязательный аргумент, содержащий символы, которые не должны быть экранированы.
Если не указано, считается, что символ «/» безопасен. Можно указать пустую строку, когда все символы должны быть экранированы. Например:
{{ value|urlencode:"" }}
Если value — "https://www.example.org/", результат будет "https%3A%2F%2Fwww.example.org%2F".
urlize
Преобразует URL-адреса и адреса электронной почты в тексте в нажимаемые ссылки.
Этот тег шаблона работает со ссылками, начинающимися с http://, https://, или www.. Например, https://goo.gl/aia1t будет преобразован, но goo.gl/aia1t — нет.
Он также поддерживает ссылки только на домен, заканчивающиеся одним из оригинальных доменных имен верхнего уровня (.com, .edu, .gov, .int, .mil, .net, и .org). Например, djangoproject.com преобразуется.
Ссылки могут иметь знаки препинания в конце (точки, запятые, закрывающие скобки) и знаки препинания в начале (открывающие скобки), и urlize по-прежнему выполнит правильные действия.
Ссылки, сгенерированные с помощью urlize, имеют добавленный атрибут rel="nofollow".
Например:
{{ value|urlize }}
Если value — "Check out www.djangoproject.com", результат будет "Check out <a href="http://www.djangoproject.com"
rel="nofollow">www.djangoproject.com</a>".
В дополнение к веб-ссылкам, urlize также преобразует адреса электронной почты в ссылки mailto:. Если value — "Send questions to foo@example.com", результат будет "Send questions to <a href="mailto:foo@example.com">foo@example.com</a>".
Фильтр urlize также принимает необязательный параметр autoescape. Если 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>'.
Как и в случае с 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 ) |
Международные теги и фильтры
i18n
Эта библиотека позволяет указать текст, подлежащий переводу, в шаблонах. Чтобы её включить, установите USE_I18N в True, а затем загрузите её с помощью {% load i18n %}.
См. Международная локализация: в коде шаблона.
l10n
Эта библиотека предоставляет контроль над локализацией значений в шаблонах. Вам нужно только загрузить библиотеку с помощью {% load l10n %}, но часто вы устанавливаете USE_L10N в True, чтобы локализация была активна по умолчанию.
См. Управление локализацией в шаблонах.
tz
Эта библиотека предоставляет контроль над преобразованием часовых поясов в шаблонах. Как и l10n, вам нужно только загрузить библиотеку с помощью {% load tz %}, но обычно вы также устанавливаете USE_TZ в True, чтобы преобразование в местное время происходило по умолчанию.
См. Вывод, учитывающий часовой пояс, в шаблонах.
Другие библиотеки тегов и фильтров
django.contrib.humanize
Набор Django-фильтров шаблонов, полезных для добавления «человеческого» аспекта в данные. См. django.contrib.humanize.
static
static
Для ссылки на статические файлы, сохраненные в STATIC_ROOT, Django поставляется с тегом шаблона static. Если приложение django.contrib.staticfiles установлено, тег будет отображать файлы с помощью метода url() хранилища, указанного в STATICFILES_STORAGE. Например:
{% load static %}
<img src="{% static 'images/hi.jpg' %}" alt="Hi!">
Он также может использовать стандартные переменные контекста, например, предполагая, что переменная user_stylesheet передана в шаблон:
{% load static %}
<link rel="stylesheet" href="{% static user_stylesheet %}" type="text/css" media="screen">
Если вам нужно получить URL статического файла без его отображения, вы можете использовать немного изменённый вызов:
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}">
Использование шаблонов 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/4.0/ref/templates/builtins/