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

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

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

autoescape

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

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

Не будут экранированы переменные помеченные как безопасные( «safe»), или кодом определяющим переменную, или после применения фильтров 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 защиты, как это описано в разделе о защите от 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 %}

In some cases you might want to refer to the current value of a cycle without advancing to the next value. To do this, give the {% cycle %} tag a name, using «as», like this:

{% 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, разделенных пробелами. Значения в одинарных (') или двойных кавычках (") рассматриваются как строки, в то время как, значения без кавычек, интерпретируются как переменные.

По умолчанию, использование тега {% cycle %} с аргументом as выведет первое значение цикла. Это может быть проблемой, если вы хотите использовать значение во вложенном теге или в включенном теге. Если вы хотите просто определить цикл, но не выводить первое значение, используйте аргумент silent в конце тега. Например:

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

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

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

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

You can use the resetcycle tag to make a {% cycle %} tag restart from its first value when it’s next encountered.

debug

Выводит всю отладочную информацию, в том числе текущей контекст и импортированные модули.

extends

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

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

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

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

Normally the template name is relative to the template loader’s root directory. A string argument may also be a relative path starting with ./ or ../. For example, assume the following directory structure:

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

In template.html, the following paths would be valid:

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

Outputs the first argument variable that is not «false» (i.e. exists, is not empty, is not a false boolean value, and is not a zero numeric value). Outputs nothing if all the passed variables are «false».

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

{% firstof var1 var2 var3 %}

Это равносильно:

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

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

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

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

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

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

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

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

for

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

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

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

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

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

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

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

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

forempty

Тег 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 %} вычисляет переменную и если она равна «true» (то есть существует, не пустая и не равна «false») выводит содержимое блока:

{% 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 tags may also use the operators ==, !=, <, >, <=, >=, in, not in, is, and is not which work as follows:

Оператор ==

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

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

Object identity. Tests if two values are the same object. Example:

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

Negated object identity. Tests if two values are not the same object. This is the negation of the is operator. Example:

{% 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
  • ==, !=, <, >, <=, >=

(This follows Python exactly). So, for example, the following complex if tag:

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

ifequal и ifnotequal

{% ifequal a b %} ... {% endifequal %} – устаревший вариант {% if a == b %} ... {% endif %}. Аналогично {% ifnotequal a b %} ... {% endifnotequal %} заменены {% if a != b %} ... {% endif %}. Теги ifequal и ifnotequal будут удалены в будущих релизах.

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

Normally the template name is relative to the template loader’s root directory. A string argument may also be a relative path starting with ./ or ../ as described in the extends tag.

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

{% include template_name %}

Можно передать любой объект с методом render(), который принимает контекст. Это позволяет указать скомпилированные объекты 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" %}

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

Примечание

The format passed can also be one of the predefined ones DATE_FORMAT, DATETIME_FORMAT, SHORT_DATE_FORMAT or SHORT_DATETIME_FORMAT. The predefined formats may vary depending on the current locale and if Формат локализации is enabled, e.g.:

It is {% now "SHORT_DATETIME_FORMAT" %}

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

{% now "Y" as current_year %}
{% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}

regroup

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

This complex tag is best illustrated by way of an example: say that cities is a list of cities represented by dictionaries containing "name", "population", and "country" keys:

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 %} produces a list (in this case, country_list) of group objects. Group objects are instances of namedtuple() with two fields:

  • grouper – значение, по которому происходила группировка (например, строка «Индия» или «Япония»).
  • list – список объектов в группе (например, список всех городов с country='India').

Because {% regroup %} produces namedtuple() objects, you can also write the previous example as:

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

Группировка по другим свойствам

Можно группировать объекты по методу, атрибуту, ключу словаря и списку объектов, в общем по всему, к чему можно получить доступ в шаблоне. Например, если «country» является внешним ключом на модель с атрибутом «description,» вы можете использовать:

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

Или, если country является полем с choices, будет доступен метод django.db.models.Model.get_FOO_display() позволяя сгруппировать по отображаемым названиям, а не значениям choices:

{% regroup cities by get_country_display as country_list %}

{{ country.grouper }} теперь будет отображать значение поля, а не ключи choices.

resetcycle

Resets a previous cycle so that it restarts from its first item at its next encounter. Without arguments, {% resetcycle %} will reset the last {% cycle %} defined in the template.

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

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

Notice how the first block ends with class="odd" and the new one starts with class="odd". Without the {% resetcycle %} tag, the second block would start with class="even".

You can also reset named cycle tags:

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

In this example, we have both the alternating odd/even rows and a «major» row every fifth row. Only the five-row cycle is reset when a category changes.

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

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

{% templatetag openblock %} url 'entry_list' {% templatetag closeblock %}

url

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

Этот способ выводить ссылки без «хардкодинга» в шаблоне, чтобы не нарушать принцип DRY:

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

The first argument is a URL pattern name. It can be a quoted literal or any other context variable. Additional arguments are optional and should be space-separated values that will be used as arguments in the URL. The example above shows passing positional arguments. Alternatively you may use keyword syntax:

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

Note that if the URL you’re reversing doesn’t exist, you’ll get an NoReverseMatch exception raised, which will cause your site to display an error page.

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

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

Don’t forget to put quotes around the URL pattern name, otherwise the value will be interpreted as a context variable!

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 в переменную. Это может быть полезно, например, при использовании тега blocktrans:

{% widthratio this_value max_value max_width as width %}
{% blocktrans %}The width is: {{ width }}{% endblocktrans %}

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 (http://php.net/date) с небольшими отличиями.

Примечание

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

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

Символ форматирования Описание Пример вывода
Day    
d День месяца, 2 цифры с ведущим нулем. От '01' до '31'
j День месяца без ведущего нуля. От '1' до '31'
D День недели, 3-х буквенное текстовое название. 'Fri'
l Название дня недели, текстовое, длинное. 'Friday'
S Английский суффикс для дня месяца, 2 символа. 'st', 'nd', 'rd' или 'th'
w Номер дня недели, без ведущих нулей. от '0' (воскресение) до '6' (суббота)
z Номер дня в году. 1 to 366
Week    
W Норме недели в году в соответствии с ISO-8601, первая неделя начинается с понедельника. 1, 53
Month    
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
Year    
y Год, 2 цифры. '99'
Y Год, 4 цифры. '1999'
L Булево значение указывающее високосный ли год. True или False
o ISO-8601 week-numbering year, corresponding to the ISO-8601 week number (W) which uses leap weeks. See Y for the more common year format. '1999'
Time    
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.“, минуты упускаются если равны нулю, значения „midnight“ и „noon“ используются по возможности. Собственное расширение. '1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.'
Timezone    
e Название временной зоны. Может быть в любом формате, или вернуть пустую строку в зависимости от объекта даты. '', 'GMT', '-500', 'US/Eastern' и др.
I Летнее время (DST), не важно, используется оно или нет. От '1' до '0'
O Разница с временем по Гринвичу '+0200'
T Часовой пояс сервера. 'EST', 'MDT'
Z Смещения часового пояса в секундах. Для часового пояса западнее UTC значение будет отрицательным, для тех, что восточнее UTC – положительным. От -43200 до 43200
Date/Time    
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 formatted date. '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) или любой другой сформированный из символов форматирования из таблицы выше. Предопределенные форматы зависят от текущего языка и настройки format-localization, например:

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

{{ value|date:"SHORT_DATE_FORMAT" }}

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

When used without a format string, the DATE_FORMAT format specifier is used. Assuming the same settings as the previous example:

{{ value|date }}

outputs 9 de Enero de 2008 (the DATE_FORMAT format specifier for the es locale is r'j \d\e F \d\e Y'). Both «d» and «e» are backslash-escaped, because otherwise each is a format string that displays the day and the timezone name, respectively.

Вы можете использовать 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" }}

If value is None, the output will be 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 can also order a list of lists (or any other object implementing __getitem__()) by elements at specified index. For example:

{{ value|dictsort:0 }}

Если value равно:

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

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

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

You must pass the index as an integer rather than a string. The following produce empty output:

{{ values|dictsort:"0" }}

dictsortreversed

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

divisibleby

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

Например:

{{ value|divisibleby:"3" }}

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

escape

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

  • < заменяется на &lt;
  • > заменяется на &gt;
  • ' (single quote) is converted to &#x27;
  • " (двойная кавычка) заменяется на &quot;
  • & заменяется на &amp;

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

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

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

escapejs

Escapes characters for use in JavaScript strings. This does not make the string safe for use in HTML or JavaScript template literals, but does protect you from syntax errors when using templates to generate JavaScript/JSON.

Например:

{{ value|escapejs }}

Если value равно "testing\r\njavascript \'string" <b>escaping</b>", будет выведено "testing\\u000D\\u000Ajavascript \\u0027string\\u0022 \\u003Cb\\u003Eescaping\\u003C/b\\u003E".

filesizeformat

Formats the value like a „human-readable“ file size (i.e. '13 KB', '4.1 MB', '102 bytes', etc.).

Например:

{{ 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 без аргументов эквивалентно floatformat с -1.

force_escape

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

например, если вы хотите экранировать тег <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=1&me=2", вывод будет "?test=1&amp;me=2".

join

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

Например:

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

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

json_script

Safely outputs a Python object as JSON, wrapped in a <script> tag, ready for use with JavaScript.

Argument: HTML «id» of the <script> tag.

Например:

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

If value is the dictionary {'hello': 'world'}, the output will be:

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

The resulting data can be accessed in JavaScript like this:

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

XSS attacks are mitigated by escaping the characters «<», «>» and «&». For example if value is {'hello': 'world</script>&amp;'}, the output is:

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

This is compatible with a strict Content Security Policy that prohibits in-page script execution. It also maintains a clean separation between passive data and executable code.

last

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

Например:

{{ value|last }}

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

length

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

Например:

{{ value|length }}

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

The filter returns 0 for an undefined variable.

length_is

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

Например:

{{ value|length_is:"4" }}

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

linebreaks

Replaces line breaks in plain text with appropriate HTML; a single newline becomes an HTML line break (<br>) and a new line followed by a blank line becomes a paragraph break (</p>).

Например:

{{ value|linebreaks }}

If value is Joel\nis a slug, the output will be <p>Joel<br>is a slug</p>.

linebreaksbr

Converts all newlines in a piece of plain text to HTML line breaks (<br>).

Например:

{{ value|linebreaksbr }}

If value is Joel\nis a slug, the output will be 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

Returns the value turned into a list. For a string, it’s a list of characters. For an integer, the argument is cast to a string before creating a list.

Например:

{{ value|make_list }}

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

phone2numeric

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

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

Например:

{{ value|phone2numeric }}

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

pluralize

Returns a plural suffix if the value is not 1, '1', or an object of length 1. By default, this suffix is '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" }}.

Примечание

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

pprint

«Обёртка» для pprint.pprint() – используется для отладки.

random

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

Например:

{{ value|random }}

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

rjust

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

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

Например:

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

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

safe

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

Примечание

If you are chaining filters, a filter applied after safe can make the contents unsafe again. For example, the following code prints the variable as is, unescaped:

{{ var|safe|escape }}

safeseq

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

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

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

slice

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

Uses the same syntax as Python’s list slicing. See https://www.diveinto.org/python3/native-datatypes.html#slicinglists for an introduction.

Например:

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

Formats the variable according to the argument, a string formatting specifier. This specifier uses the printf-style String Formatting syntax, with the exception that the leading «%» is dropped.

Например:

{{ 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. Если вам нужна более надежная проверка, используйте библиотеку bleach Python, а точнее метод clean.

time

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

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

Например:

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

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

Note that you can backslash-escape a format string if you want to use the «raw» value. In this example, both «h» and «m» are backslash-escaped, because otherwise each is a format string that displays the hour and the month, respectively:

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

This would display as «01h 23m».

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

Предположим USE_L10N равно True и LANGUAGE_CODE равно "de", тогда:

{{ value|time:"TIME_FORMAT" }}

the output will be the string "01:23" (The "TIME_FORMAT" format specifier for the de locale as shipped with Django is "H:i").

The time filter will only accept parameters in the format string that relate to the time of day, not the date. If you need to format a date value, use the date filter instead (or along with time if you need to render a full datetime value).

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

When used without a format string, the TIME_FORMAT format specifier is used:

{{ value|time }}

is the same as:

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

Truncates a string if it is longer than the specified number of characters. Truncated strings will end with a translatable ellipsis character («…»).

Аргумент: длина строки в символах

Например:

{{ value|truncatechars:7 }}

If value is "Joel is a slug", the output will be "Joel i…".

truncatechars_html

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

Например:

{{ value|truncatechars_html:7 }}

If value is "<p>Joel is a slug</p>", the output will be "<p>Joel i…</p>".

Символы новой строки в содержимом будут сохранены.

truncatewords

Обрезает строку после указанного количества слов.

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

Например:

{{ value|truncatewords:2 }}

If value is "Joel is a slug", the output will be "Joel is …".

Переносы строки будут удалены.

truncatewords_html

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

Этот фильтр менее эффективен, чем truncatewords, используйте его только с HTML-текстом.

Например:

{{ value|truncatewords_html:2 }}

If value is "<p>Joel is a slug</p>", the output will be "<p>Joel is …</p>".

Символы новой строки в содержимом будут сохранены.

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://goo.gl/aia1t будет конвертирован, goo.gl/aia1t – нет.

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

Примечание

If urlize is applied to text that already contains HTML markup, or to email addresses that contain single quotes ('), things won’t work as expected. Apply this filter only to plain text.

urlizetrunc

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

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

Например:

{{ value|urlizetrunc:15 }}

If value is "Check out www.djangoproject.com", the output would be '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 выводит строки «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 %}. Если установить USE_L10N в True, локализация будет активна по-умолчанию.

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

tz

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

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

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

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

django.contrib.humanize

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

static

static

To link to static files that are saved in STATIC_ROOT Django ships with a static template tag. If the django.contrib.staticfiles app is installed, the tag will serve files using url() method of the storage specified by STATICFILES_STORAGE. For example:

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

It is also able to consume standard context variables, e.g. assuming a user_stylesheet variable is passed to the template:

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

If you’d like to retrieve a static URL without displaying it, you can use a slightly different call:

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

Using Jinja2 templates?

See Jinja2 for information on using the static tag with 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 и быть уверенными, что это значение правильно экранировано и безопасно.