• 3.1
  • 3.2
  • 6.1
  • Версия документации: 5.0

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

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

Список встроенных тегов

autoescape

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

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

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

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

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

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

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

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

Чтобы правильно экранировать каждый элемент последовательности, используйте фильтр escapeseq:

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

openblock

Определяет блок, который может быть переопределен в дочернем шаблоне. Смотрите подробности в разделе о наследовании шаблонов.

opencomment

Игнорирует содержимое между {% 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 защиты, как это описано в разделе о защите от 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 %}

С этого момента вы можете вставлять текущее значение цикла в любое место вашего шаблона, ссылаясь на имя цикла как на контекстную переменную. Если вы хотите переместить цикл к следующему значению независимо от исходного тега «цикл», вы можете использовать другой тег «цикл» и указать имя переменной. Итак, следующий шаблон:

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

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

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

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

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

debug

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

extends

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

Может использоваться двумя способами:

  • {% extends "base.html" %} (с кавычками) использует буквальное значение "base.html" в качестве названия родительского шаблона.

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

Смотрите подробности в Наследование шаблонов.

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

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

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

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

filter

Содержимое тега будет обработано указанными фильтрами. Можно указать цепочку фильтров, а также их аргументы, как и при выводе переменной в шаблоне.

Содержимое тега включает весь текст между filter и endfilter.

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

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

Примечание

Нельзя передавать фильтры escape и safe. Вместо этого используйте тег autoescape.

firstof

Выводит первую из переданных переменных, которая не равна False. Ничего не выводит, если все переменные равны False.

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

{% firstof var1 var2 var3 %}

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

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

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

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

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

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

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

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

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

or

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

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

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

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

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

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

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

Помните, что при обращении через точку для словарю сначала ищется ключ, а затем метод. Если словарь data содержит ключ 'items', data.items вернет data['items'] вместо data.items(). Избегайте использования ключей, которые совпадают с названиями методов, если вы хотите их использовать в шаблоне (items, values, keys, и т.д.). Порядок получения значения описан в разделе о переменных шаблонов.

Внутри цикла доступные некоторые дополнительные переменные:

Переменная

Описание

forloop.counter

Номер текущей итерации цикла начиная с 1

forloop.counter0

Номер текущей итерации цикла начиная с 0

forloop.revcounter

Номер текущей итерации цикла начиная с конца с 1

forloop.revcounter0

Номер текущей итерации цикла начиная с конца с 0

forloop.first

True, если это первая итерация

forloop.last

True, если это последняя итерация

forloop.parentloop

Для вложенных циклов, это «внешний» цикл.

for … empty

Тег for может принимать необязательное предложение {% пустой %}, текст которого отображается, если данный массив пуст или не может быть найден:

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>

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

<ul>
  {% if athlete_list %}
    {% for athlete in athlete_list %}
      <li>{{ athlete.name }}</li>
    {% endfor %}
  {% else %}
    <li>Sorry, no athletes in this list.</li>
  {% endif %}
</ul>

если

Тег {% if %} оценивает переменную, и если эта переменная имеет значение «истина» (т. е. существует, не пуста и не является ложным логическим значением), выводится содержимое блока:

{% 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 которые работают таким образом:

Оператор ==

Равенство. Пример:

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

Оператор in

Идентичность объекта. Проверяет, являются ли два значения одним и тем же объектом. Пример:

{% 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 %}
Оператор in

Отрицаемая идентичность объекта. Проверяет, не являются ли два значения одним и тем же объектом. Это отрицание оператора is. Пример:

{% if somevar is not True %}
  This appears if somevar is not True, or if somevar is not found in the
  context.
{% endif %}

{% if somevar is not None %}
  This appears if and only if somevar is not None.
{% endif %}

Фильтры

Вы также можете использовать фильтры в выражении if. Например:

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

Сложные выражения

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

  • or

  • and

  • not

  • in

  • ==, !=, <, >, <=, >=

(Это в точности соответствует Python). Так, например, следующий сложный тег if:

{% if a == b or c == d and e %}

…будет интерпретирован как:

(a == b) or ((c == d) and e)

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

Операторы сравнения не могут быть «связаны в цепочку», как в Python или в математической записи. Например, вместо использования:

{% if a > b > c %}  (WRONG)

вы должны использовать:

{% if a > b and b > c %}

ifchanged

Проверяет было ли изменено значение с предыдущей итерации цикла.

Блочный тег {% ifchanged %} используется внутри цикла. Существует два способа использовать тег.

  1. Сверяет собственное отображаемое содержимое с его предыдущим состоянием и отображает содержимое только в том случае, если оно изменилось. Например, это отображает список дней, отображая только месяц, если он меняется:

    <h1>Archive for {{ year }}</h1>
    
    {% for date in days %}
        {% ifchanged %}<h3>{{ date|date:"F" }}</h3>{% endifchanged %}
        <a href="{{ date|date:"M/d"|lower }}/">{{ date|date:"j" }}</a>
    {% endfor %}
    
  2. Если задана одна или несколько переменных, проверьте, изменилась ли какая-либо переменная. Например, следующее показывает дату каждый раз, когда она меняется, и показывает час, если изменился час или дата:

    {% for date in days %}
        {% ifchanged date.date %} {{ date.date }} {% endifchanged %}
        {% ifchanged date.hour date.date %}
            {{ date.hour }}
        {% endifchanged %}
    {% endfor %}
    

Тег ifchanged также может содержать необязательное предложение {% else %}, которое будет отображаться, если значение не изменилось:

{% for match in matches %}
    <div style="background-color:
        {% ifchanged match.ballot_id %}
            {% cycle "red" "blue" %}
        {% else %}
            gray
        {% endifchanged %}
    ">{{ match }}</div>
{% endfor %}

include

Загружает шаблон и выводит его с текущим контекстом. Это способ «включить» один шаблон в другой.

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

Этот пример включает содержимое шаблона "foo/bar.html":

{% include "foo/bar.html" %}

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

Этот пример включает в себя содержимое шаблона, имя которого содержится в переменной «template_name»:

{% include template_name %}

Можно передать любой объект с методом render(), который принимает контекст. Это позволяет указать скомпилированные объекты Template из контекста.

Кроме того, переменная может быть итерацией имен шаблонов, и в этом случае будет использоваться первый, который может быть загружен, согласно select_template().

Включенный шаблон выполняется с контекстом шаблона, который его включает. Этот пример выводит "Hello, John!":

  • Контекст: переменная person равна "john" и greeting равна "Hello".

  • Шаблон:

    {% include "name_snippet.html" %}
    
  • Шаблон name_snippet.html:

    {{ greeting }}, {{ person|default:"friend" }}!
    

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

{% include "name_snippet.html" with person="Jane" greeting="Hello" %}

Если вы хотите отображать контекст только с предоставленными переменными (или даже без переменных вообще), используйте опцию «only». Во включенном шаблоне другие переменные недоступны:

{% include "name_snippet.html" with greeting="Hi" only %}

Примечание

Тег include должен восприниматься как «выполним этот под-шаблон и включим полученный HTML», а не «парсим этот под-шаблон и включаем его как часть родительского». Это означает, что нет никакого общего состояния между включенными шаблонами – каждое включение это полностью независимый процесс.

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

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 %} выведет два случайных слова на латыни.

no

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

Например:

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

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

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

Этот пример выведет «It is the 4th of September».

Примечание

Передаваемый формат также может быть одним из предопределенных:setting: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 %}

строка запроса

New in Django 5.1.

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

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

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

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

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

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

{% querystring %}

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

{% querystring size="M" %}

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

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

{% querystring my_query_dict %}

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

Настройка элементов

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

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

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

{% querystring color=None %}

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

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

{% querystring color=my_list %}

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

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

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

{% querystring page=page.next_page_number %}

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

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

regroup

Группирует объекты по общему атрибуту.

Этот сложный тег лучше всего объяснить с помощью примера: «places» является списком городов, представленным словарями с ключами "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) из групп объектов. Каждый объект группы содержит два атрибута:

  • 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"},
]

В результате применения тега {% 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 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.

cycle

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

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

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

Этот пример вернет этот HTML:

<h1>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 %} для отображения одной из комбинаций символов тега шаблона.

Аргумент указывает, какой элемент синтаксиса отображать:

Аргумент

Вывод

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 принимает ID клиента (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 который не существует, будет выброшено исключение django.core.urlresolvers.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, включая использование данных контекста для определения текущего приложения.

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

Не забудьте взять в кавычки 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 %}

Список встроенных фильтров

добавить

Суммирует аргумент и значение.

Например:

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

вырезать

Удаляет значение аргумента из строки, к которой применяется фильтр.

Например:

{{ value|cut:" " }}

Если value равно "String with spaces", результат будет "Stringwithspaces".

date

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

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

Примечание

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

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

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

Описание

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

День

д

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

От '01' до '31'

j

День месяца без ведущего нуля.

От '1' до '31'

Д

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

'Fri'

л

Название дня недели, текстовое, длинное.

'Friday'

С

Английский суффикс для дня месяца, 2 символа.

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

ч

Номер дня недели, без ведущих нулей.

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

з

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

От 0 до 365

Неделя

W

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

1, 53

Месяц

м

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

От '01' до '12'

н

Номер месяца без ведущего нуля.

От '1' до '12'

М

Название месяца, текстовое, 3-х буквенное.

'Jan'

б

Название месяца, 3-х буквенное, в нижнем регистре.

'jan'

Э

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

'listopada' (для польского языка, не 'Listopad')

Ф

Название месяца, текстовое, длинное.

'January'

Н

Аббревиатура названия месяца в формате Associated Press. Собственное расширение.

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

т

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

От 28 до 31

Год

у

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

от '00' до '99'

`` Д``

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

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

Л

Булево значение указывающее високосный ли год.

True или False

`` о``

week-numbering год в соответствии с ISO-8601

'1999'

Время

г

Час, 12-часовом формате без ведущих нулей.

От '1' до '12'

Г

Час, 24-часовой формат

От '0' до '23'

ч

Час, 12-часовой формат.

От '01' до '12'

Ч

Час, 24-часовой формат.

От '00' до '23'

я

Минуты.

От '00' до '59'

с

Секунды, 2-цифирный формат без ведущих нулей.

От '00' до '59'

`` ты``

микросекунды

От 000000 до 999999

а

'a.m.' или 'p.m.' (немного отличается от функции PHP, так как отображает в стиле Associated Press.)

'a.m.'

А

'AM' или 'PM'.

'AM'

ф

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

'1', '1:30'

П

Время, в 12-часовом формате, минуты и „a.m.“/“p.m.“, минуты упускаются если равны нулю, значения „midnight“ и „noon“ используются по возможности. Собственное расширение.

'1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.'

Часовой пояс

е

Название временной зоны. Может быть в любом формате, или вернуть пустую строку в зависимости от объекта даты.

'', 'GMT', '-500', 'US/Eastern' и др.

Я

Летнее время, независимо от того, действует оно или нет.

От '1' до '0'

О

Разница с временем по Гринвичу

'+0200'

Т

Часовой пояс сервера.

'EST', 'MDT'

З

Смещения часового пояса в секундах. Для часового пояса западнее UTC значение будет отрицательным, для тех, что восточнее UTC – положительным.

От -43200 до 43200

Дата/Время

с

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

2008-01-02T10:30:00.000123+02:00, или 2008-01-02T10:30:00.000123 если время относительное

р

Дата в формате RFC 2822.

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

У

Секунды с начала эпохи 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) или любой другой сформированный из символов форматирования из таблицы выше. Предопределенные форматы зависят от текущего языка и настройки format-localization, например:

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

{{ value|date:"SHORT_DATE_FORMAT" }}

результат вывода будет "09/01/2008" (формат "SHORT_DATE_FORMAT" для языка es указан в Django как "d/m/Y").

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

{{ value|date }}

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

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

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

default

Если значение равно False, будет использовано значение по-умолчанию. В противном случае используется значение.

Например:

{{ value|default:"nothing" }}

Если value равно "" (пустая строка), будет выведено nothing.

default_if_none

Если (и только в этом случае) значение равно None, будет использовано значение по-умолчанию. В противном случае используется значение.

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

Например:

{{ value|default_if_none:"nothing" }}

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

dictsort

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

Например:

{{ value|dictsort:"name" }}

Если value равно:

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

будет возвращено:

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

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

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

Если books равно:

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

будет возвращено:

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

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

{{ value|dictsort:0 }}

Если value равно:

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

будет возвращено:

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

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

{{ values|dictsort:"0" }}

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

dictsortreversed

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

divisibleby

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

Например:

{{ value|divisibleby:"3" }}

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

escape

Экранирует HTML. В частности выполняются такие замены:

  • < заменяется на &lt;

  • > заменяется на &gt;

  • ' (одинарная кавычка) заменяется на &#39;

  • " (двойная кавычка) заменяется на &quot;

  • & заменяется на &amp;

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

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

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

Объединение escape с другими фильтрами

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

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

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

escapejs

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

Например:

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

escapeseq

New in Django 5.0.

Применяет фильтр 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 не соответствует Международной системе единиц, которая рекомендует использовать кибибайт, мебибайт, гибибайт, и т.д. когда размеры байта вычислены в степени 1024 (данный случай). Вместо этого Django использует традиционные имена для единиц измерений (Кбайт, Мбайт, Гбайт, и т.д.) соответствующие именам, которые используются обычно.

first

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

Например:

{{ value|first }}

Если value равно ['a', 'b', 'c'], будет возвращено 'a'.

floatformat

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

value

Шаблон

Вывод

34.23234

{{ value|floatformat }}

34.2

34.00000

{{ value|floatformat }}

34

34.26000

{{ value|floatformat }}

34.3

Если используется целочисленный аргумент, floatformat округляет до указанного количества знаков после запятой. Например:

value

Шаблон

Вывод

34.23234

{{ value|floatformat:3 }}

34.232

34.00000

{{ value|floatformat:3 }}

34.000

34.26000

{{ value|floatformat:3 }}

34.260

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

value

Шаблон

Вывод

34.23234

{{ value|floatformat:"0" }}

34

34.00000

{{ value|floatformat:"0" }}

34

39.56000

{{ value|floatformat:"0" }}

40

Если аргумент отрицательный, floatformat округляет до указанного количества знаков после запятой – но дробная часть отображается только если существует. Например:

value

Шаблон

Вывод

34.23234

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

34.232

34.00000

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

34

34.26000

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

34.260

Если аргумент, переданный в floatformat, имеет суффикс g, это приведет к принудительной группировке по параметру THOUSAND_SEPARATOR` для активной локали. Например, если активным языковым стандартом является en (английский):

value

Шаблон

Вывод

34232.34

{{ value|floatformat:"2g" }}

34 232,34

34232.06

{{ value|floatformat:"g" }}

34 232,1

34232.00

{{ value|floatformat:"-3g" }}

34 232

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

value

Шаблон

Вывод

34.23234

{{ value|floatformat:"3" }}

34 232

34.23234

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

34.232

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

force_escape

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

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

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

get_digit

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

Например:

{{ value|get_digit:"2" }}

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

iriencode

Конвертирует IRI (Internationalized Resource Identifier) в строку, которая может быть использована в URL. Это необходимо, если вы хотите использовать не ASCII символы в URL.

Можно использовать этот фильтр после использования фильтра urlencode.

Например:

{{ value|iriencode }}

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

in

Объединяет список, используя указанную строку, аналог str.join(list) в Python

Например:

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

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

striptags

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

Аргумент: Необязательный HTML-идентификатор тега <script>.

Например:

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

Если value равно ['a', 'b', 'c'], будет возвращено 'a'.

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

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

const value = JSON.parse(document.getElementById('hello-data').textContent);

XSS-атаки смягчаются за счет экранирования символов «<», «>» и «&». Например, если value равно {'hello': 'world</script>&amp;'}, выходные данные будут следующими:

<script id="hello-data" type="application/json">{"hello": "world\\u003C/script\\u003E\\u0026amp;"}</script>

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

forloop.last

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

Например:

{{ value|last }}

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

length

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

Например:

{{ value|length }}

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

Фильтр возвращает 0 для неопределенных переменных. Ранее возвращал пустую строку.

linebreaks

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

Например:

{{ value|linebreaks }}

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

linebreaksbr

Заменяет все переносы строки на <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

Превращает значение в список. Для строк это будет список символов. Число сначала конвертируется в unicode, а потом в список.

Например:

{{ value|make_list }}

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

phone2numeric

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

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

Например:

{{ value|phone2numeric }}

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

pluralize

Возвращает суффикс множественного числа, если значение не 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

Форматирует значение в соответствии с аргументом, который является спецификатором форматирования строк. Спецификатор использует синтаксис форматирования строк Python, с той лишь разницей, что ведущий символ «%» опущен.

Например:

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

datetimes

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

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

Например:

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

Если value равно datetime.datetime.now(), может вернуть "01:23".

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

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

Этот пример выведет «It is the 4th of September».

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

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

{{ value|time:"TIME_FORMAT" }}

будет возвращена строка "01:23:00" (формат "TIME_FORMAT" для языка de определен в Django как "H:i:s").

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

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

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

{{ value|time }}

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

{{ value|time:"TIME_FORMAT" }}

timesince

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

Принимает необязательный аргумент, представляющий собой переменную, содержащую дату, используемую в качестве точки сравнения (без аргумента точка сравнения — сейчас). Например, если «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|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-строк может потребовать больших ресурсов и повлиять на производительность службы. truncatechars_html ограничивает ввод первыми пятью миллионами символов.

Changed in Django 3.2.22:

В старых версиях обрабатывались строки длиной более пяти миллионов символов.

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-строк может потребовать больших ресурсов и повлиять на производительность службы. truncatewords_html ограничивает ввод первыми пятью миллионами символов.

Changed in Django 3.2.22:

В старых версиях обрабатывались строки длиной более пяти миллионов символов.

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-ы и email-ы в тексте в «кликабельные» ссылки.

Этот тег шаблона работает со ссылками с префиксом http://, https:// или www.. Например, https://djangocon.eu будет преобразовано, а djangocon.eu — нет.

Поддерживаются ссылки состоящие только из домена и заканчивающиеся на один из первоначальных доменов первого уровня (.com, .edu, .gov, .int, .mil, .net, and .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 также преобразует email-ы в ссылки с 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 будут экранированы с помощью фильтра escape. Значение по-умолчанию для autoescape равно True.

Примечание

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

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

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

{{ value|truncatechars:500|urlize }}

urlizetrunc

Преобразует URL-ы в ссылки как и urlize, но обрезает название ссылок длиннее указанного предела.

Аргумент: Максимальное количество символов в названии ссылки, включая многоточие, добавленное при обрезании текста.

Например:

{{ value|urlizetrunc:15 }}

Если value равно "Check out www.djangoproject.com", вернет 'Check out <a href="http://www.djangoproject.com" rel="nofollow">www.djangopr...</a>'.

Как и urlize, фильтр следует применять к обычному тексту.

wordcount

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

Например:

{{ value|wordcount }}

Если value равно "Joel is a slug", вернет 4.

wordwrap

«Оборачивает» слова до указанной длины строки.

Аргумент: количество символов в строке

Например:

{{ value|wordwrap:5 }}

Если value равно Джоэл - слизень, вывод будет таким:

Joel
is a
slug

yes

Для True, False и (опционально) None выводит строки «yes», «no», «maybe», или другие, переданные как список значений, разделенный запятыми:

Например:

{{ value|yesno:"yeah,no,maybe" }}

Значение

Аргумент

Вывод

True

yes

True

"yeah,no,maybe"

yeah

False

"yeah,no,maybe"

no

None

"yeah,no,maybe"

maybe

None

"yeah,no"

no (конвертирует None в False, если значение для None не указано)

Теги и фильтры для интернационализация

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

i18n

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

Смотрите Интернационализация: в коде шаблонов.

l10n

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

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

тц

Эта библиотека предоставляет возможность преобразовывать временные зоны в шаблонах. Как и l10n, просто загрузите библиотеку {% load tz %}. Но если установить USE_TZ в True, преобразование в локальное время будет происходить автоматически.

Смотрите Вывод объектов абсолютного времени в шаблонах.

Другие библиотеки тегов и фильтров

Django содержит несколько других библиотек тегов. Чтобы их использовать, добавьте приложение в INSTALLED_APPS и загрузите библиотеку тегом {% load %}.

django.contrib.humanize

Набор фильтров для добавления «человечности» вашим данным. Смотрите django.contrib.humanize.

static

static

Для ссылки на статические файлы, сохраненные в STATIC_ROOT, Django поставляется с тегом шаблона static. Если установлено приложение django.contrib.staticfiles, тег будет обслуживать файлы, используя метод url() для хранилища, указанного staticfiles в STORAGES. Например:

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

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

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

Если вы хотите получить URL не выводя его, используйте следующий код:

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

Использование шаблонов Jinja2?

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

get_static_prefix

Вам следует предпочесть тег шаблона static, но если вам нужен больший контроль над тем, где и как именно STATIC_URL вводится в шаблон, вы можете использовать тег шаблона get_static_prefix:

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

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

{% load static %}
{% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!">
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!">

get_media_prefix

Подобно get_static_prefix, get_media_prefix заполняет переменную шаблона медиа-префиксом MEDIA_URL, например:

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

Сохранив значение в атрибуте data, мы можем использовать его в JavaScript и быть уверенными, что это значение правильно экранировано и безопасно.

Back to Top