Spec-Zone.ru › Django 1.8

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

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

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

autoescape

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

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

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

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

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

block

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

comment

Игнорирует все между {% comment %} и {% endcomment %}. Дополнительная заметка может быть вставлена в первый тег. Например, это полезно, когда код прокомментирован для документирования причин его отключения.

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

<p>Rendered text with {{ pub_date|date:"c" }}</p>
{% comment "Optional note" %}
    <p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}

comment теги не могут быть вложены.

csrf_token

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

cycle

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

Этот тег особенно полезен в цикле:

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}

В первой итерации выводится HTML, который ссылается на класс row1, во второй — на row2, в третьей — на row1 и так далее для каждой итерации цикла.

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

{% for o in some_list %}
    <tr class="{% cycle rowvalue1 rowvalue2 %}">
        ...
    </tr>
{% endfor %}

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

{% for o in some_list %}
    <tr class="{% autoescape off %}{% cycle rowvalue1 rowvalue2 %}{% endautoescape %}">
        ...
    </tr>
{% endfor %}

Вы можете смешивать переменные и строки:

{% for o in some_list %}
    <tr class="{% cycle 'row1' rowvalue2 'row3' %}">
        ...
    </tr>
{% endfor %}

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

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

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

<tr>
    <td class="{% cycle 'row1' 'row2' as rowcolors %}">...</td>
    <td class="{{ rowcolors }}">...</td>
</tr>
<tr>
    <td class="{% cycle rowcolors %}">...</td>
    <td class="{{ rowcolors }}">...</td>
</tr>

выведет:

<tr>
    <td class="row1">...</td>
    <td class="row1">...</td>
</tr>
<tr>
    <td class="row2">...</td>
    <td class="row2">...</td>
</tr>

Вы можете использовать любое количество значений в теге cycle, разделенных пробелами. Значения, заключенные в одинарные кавычки (') или двойные кавычки ("), рассматриваются как строковые литералы, а значения без кавычек — как переменные шаблона.

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

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

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

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

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

Для обратной совместимости, тег {% cycle %} поддерживает значительно уступающий старый синтаксис из предыдущих версий Django. Вы не должны использовать его в новых проектах, но ради людей, которые всё ещё его используют, вот как он выглядит:

{% cycle row1,row2,row3 %}

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

debug

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

extends

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

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

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

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

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

for

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

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

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

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

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

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

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

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

Цикл for устанавливает ряд переменных, доступных внутри цикла:

Переменная Описание
forloop.counter Текущая итерация цикла (индексирование с 1)
forloop.counter0 Текущая итерация цикла (индексирование с 0)
forloop.revcounter Количество итераций от конца цикла (индексирование с 1)
forloop.revcounter0 Количество итераций от конца цикла (индексирование с 0)
forloop.first True, если это первая итерация цикла
forloop.last True, если это последняя итерация цикла
forloop.parentloop Для вложенных циклов, это цикл, окружающий текущий

for ... empty

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

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

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

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

if

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

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

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

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

следует использовать:

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

Фильтры

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

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

Этот пример включает содержимое шаблона, имя которого содержится в переменной 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 %}

Если включённый шаблон вызывает исключение во время рендеринга (в том числе, если он отсутствует или содержит синтаксические ошибки), поведение зависит от опции template engine's debug (если не установлена, эта опция по умолчанию принимает значение DEBUG). При включённом режиме отладки исключение, например, TemplateDoesNotExist или TemplateSyntaxError будет поднято; в противном случае {% include %} подавляет любое исключение, произошедшее во время рендеринга включённого шаблона, и возвращает пустую строку.

Примечание

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

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

load

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

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

{% load somelibrary package.otherlibrary %}

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

{% load foo bar from somelibrary %}

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

lorem

Тег ранее располагался в django.contrib.webdesign.

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

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

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

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

Аргумент Описание
count Число (или переменная), содержащая количество абзацев или слов для генерации (по умолчанию 1).
method Либо w для слов, p для HTML абзацев или b для абзацев обычного текста (по умолчанию b).
random Слово random, если задано, не использует стандартный абзац («Lorem ipsum dolor sit amet...») при генерации текста.

Примеры:

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

now

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

Пример:

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

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

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

Это отобразится как «Сегодня 4 сентября».

Примечание

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

It is {% now "SHORT_DATETIME_FORMAT" %}

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

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

Добавлена возможность использовать синтаксис «as».

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 item in country.list %}
          <li>{{ item.name }}: {{ item.population }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

Давайте пройдемся по этому примеру. {% regroup %} принимает три аргумента: список, который вы хотите сгруппировать, атрибут для группировки и имя результирующего списка. Здесь мы группируем список cities по атрибуту country и называем результат country_list.

{% regroup %} создаёт список (в данном случае country_list) из объектов группы. Каждый объект группы имеет два атрибута:

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

Обратите внимание, что {% regroup %} не сортирует свой вход! Наш пример опирается на тот факт, что список cities был отсортирован по country в первую очередь. Если список cities не сортировал своих членов по country, группировка бы показала более одной группы для одной страны. Например, предположим, что список cities был задан так (обратите внимание, что страны не сгруппированы вместе):

cities = [
    {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
    {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
    {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
    {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
    {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]

С этим входом для cities, пример шаблона кода {% regroup %} выше приведет к следующему выводу:

  • Индия
    • Мумбаи: 19 000 000
  • США
    • Нью-Йорк: 20 000 000
  • Индия
    • Калькутта: 15 000 000
  • США
    • Чикаго: 7 000 000
  • Япония
    • Токио: 33 000 000

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

Другое решение — отсортировать данные в шаблоне с помощью фильтра dictsort, если ваши данные находятся в списке словарей:

{% regroup cities|dictsort:"country" by country as country_list %}

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

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

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

Или, если country — это поле с choices, оно будет иметь метод get_FOO_display(), доступный как атрибут, позволяя группировать по строке отображения, а не по ключу choices:

{% regroup cities by get_country_display as country_list %}

{{ country.grouper }} теперь отобразит поля значений из набора choices вместо ключей.

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

ssi

Устарело начиная с версии 1.8: Этот тег устарел и будет удален в Django 1.10. Используйте тег include вместо него.

Выводит содержимое заданного файла на страницу.

Как и простой тег include, {% ssi %} включает содержимое другого файла — который должен быть указан с помощью абсолютного пути — в текущую страницу:

{% ssi '/home/html/ljworld.com/includes/right_generic.html' %}

Первый параметр ssi может быть строковой литералом или любой другой переменной контекста.

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

{% ssi '/home/html/ljworld.com/includes/right_generic.html' parsed %}

Обратите внимание, что если вы используете {% ssi %}, вам нужно будет определить 'allowed_include_roots' в OPTIONS вашей движка шаблонов в качестве меры безопасности.

Примечание

С тегом ssi и параметром parsed нет общих состояний между файлами — каждый включённый элемент является полностью независимым процессом рендеринга. Это означает, что, например, невозможно определить блоки или изменить контекст на текущей странице с использованием включённого файла.

См. также: {% include %}.

templatetag

Выводит один из символов синтаксиса, используемых для составления тегов шаблона.

Поскольку система шаблонов не имеет понятия «экранирования», для отображения одного из фрагментов, используемых в тегах шаблонов, необходимо использовать тег {% templatetag %}.

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

Аргумент Выводит
openblock {%
closeblock %}
openvariable {{
closevariable }}
openbrace {
closebrace }
opencomment {#
closecomment #}

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

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

url

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

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

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

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

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

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

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

('^client/([0-9]+)/$', app_views.client, name='app-views-client')

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

('^clients/', include('project_name.app_name.urls'))

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

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

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

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

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

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

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

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

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

{% url 'some-url-name' as the_url %}
{% if the_url %}
  <a href="{{ the_url }}">Link to optional stuff</a>
{% endif %}

Если вы хотите получить URL с именем пространства имён, укажите полное квалифицированное имя:

{% url 'myapp:view-name' %}

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

Устарело начиная с версии 1.8: Вы также можете передать путь с точкой Python к функции представления, но этот синтаксис устарел и будет удалён в Django 1.10:

{% url 'path.to.some_view' v1 v2 %}

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

Не забудьте поставить кавычки вокруг url() name, в противном случае значение будет интерпретировано как переменная контекста!

verbatim

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

Часто используется для разрешения использования слоя шаблонов JavaScript, который конфликтует с синтаксисом Django. Например:

{% verbatim %}
    {{if dying}}Still alive.{{/if}}
{% endverbatim %}

Вы также можете указать определённый закрывающий тег, что позволит использовать {% endverbatim %} в составе неотрендеренного содержимого:

{% verbatim myblock %}
    Avoid template rendering via the {% verbatim %}{% endverbatim %} block.
{% endverbatim myblock %}

widthratio

Для создания столбчатых диаграмм и подобных элементов этот тег вычисляет отношение заданного значения к максимальному значению и затем применяет это отношение к константе.

Например:

<img src="bar.png" alt="Bar"
     height="10" width="{% widthratio this_value max_value max_width %}" />

Если this_value равно 175, max_value равно 200, и max_width равно 100, изображение в вышеприведённом примере будет шириной 88 пикселей (потому что 175/200 = 0,875; 0,875 * 100 = 87,5, которое округляется до 88).

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

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

Возможность использовать «as» с этим тегом, как в приведённом выше примере, была добавлена.

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", выходной результат будет date().

date

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

Использует формат, похожий на функцию date() PHP (http://php.net/date) с некоторыми отличиями.

Примечание

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

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

Символ форматирования Описание Пример выходных данных
a 'a.m.' или 'p.m.' (Обратите внимание, что это немного отличается от вывода PHP, поскольку это включает точки для соответствия стилю Associated Press.) 'a.m.'
A 'AM' или 'PM'. 'AM'
b Месяц, текстовый, 3 буквы, строчные. 'jan'
B Не реализовано.
c Формат ISO 8601. (Примечание: в отличие от других форматировщиков, таких как «Z», «O» или «r», форматировщик «c» не будет добавлять смещение часового пояса, если значение является неявной датой и временем (см. datetime.tzinfo). 2008-01-02T10:30:00.000123+02:00, или 2008-01-02T10:30:00.000123 если дата и время неявные
d Число месяца, 2 цифры с ведущими нулями. '01' до '31'
D День недели, текстовый, 3 буквы. 'Fri'
e Имя часового пояса. Может быть в любом формате или может возвращать пустую строку, в зависимости от даты и времени. '', 'GMT', '-500', 'US/Eastern', и т.д.
E Месяц, локально-специфическое альтернативное представление, обычно используемое для представления длинных дат. 'listopada' (для польской локали, в отличие от 'Listopad')
f Время, в 12-часовом формате часов и минут, с опущенными минутами, если они равны нулю. Собственная расширение. '1', '1:30'
F Месяц, текстовый, полный. 'January'
g Час, 12-часовой формат без ведущих нулей. '1' до '12'
G Час, 24-часовой формат без ведущих нулей. '0' до '23'
h Час, 12-часовой формат. '01' до '12'
H Час, 24-часовой формат. '00' до '23'
i Минуты. '00' до '59'
I Летнее время, действует или нет. '1' или '0'
j Число месяца без ведущих нулей. '1' до '31'
l День недели, текстовый, полный. 'Friday'
L Булево значение, является ли это високосным годом. True или False
m Месяц, 2 цифры с ведущими нулями. '01' до '12'
M Месяц, текстовый, 3 буквы. 'Jan'
n Месяц без ведущих нулей. '1' до '12'
N Сокращение месяца в стиле Associated Press. Собственная расширение. 'Jan.', 'Feb.', 'March', 'May'
o Год ISO-8601 с учётом недели, соответствующий номеру недели ISO-8601 (W) '1999'
O Разница с Гринвичским временем в часах. '+0200'
P Время в 12-часовом формате часов, минут и «a.m.»/«p.m.», с опущенными минутами, если они равны нулю, и специальными строками «полночь» и «полдень», если это уместно. Собственная расширение. '1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.'
r RFC 2822 отформатированная дата. 'Thu, 21 Dec 2000 16:01:07 +0200'
s Секунды, 2 цифры с ведущими нулями. '00' до '59'
S Английский порядковый суффикс для числа месяца, 2 символа. 'st', 'nd', 'rd' или 'th'
t Количество дней в данном месяце. 28 до 31
T Часовой пояс этого компьютера. 'EST', 'MDT'
u Микросекунды. 000000 до 999999
U Секунды с эпохи Unix (1 января 1970 года 00:00:00 по UTC).
w День недели, цифры без ведущих нулей. '0' (воскресенье) до '6' (суббота)
W Номер недели ISO-8601 года, недели начинаются с понедельника. 1, 53
y Год, 2 цифры. '99'
Y Год, 4 цифры. '1999'
z Номер дня в году. 0 до 365
Z Смещение часового пояса в секундах. Смещение для часовых поясов к западу от UTC всегда отрицательное, а для тех, что к востоку от UTC, всегда положительное. -43200 до 43200

Например:

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

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

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

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

{{ value|date:"SHORT_DATE_FORMAT" }}

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

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

{{ value|date }}

…будет использована строка форматирования, определённая в настройке DATE_FORMAT, без применения локализации.

Вы можете комбинировать 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)

dictsortreversed

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

divisibleby

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

Например:

{{ value|divisibleby:"3" }}

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

escape

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

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

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

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

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

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

escapejs

Экранирует символы для использования в строках JavaScript. Это не делает строку безопасной для использования в HTML, но защищает от синтаксических ошибок при использовании шаблонов для генерации JavaScript/JSON.

Например:

{{ value|escapejs }}

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

filesizeformat

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

Например:

{{ value|filesizeformat }}

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

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

Строго говоря, filesizeformat не соответствует Международной системе единиц, которая рекомендует использовать KiB, MiB, GiB и т.д., когда размеры байтов рассчитываются в степенях 1024 (что и используется здесь). Вместо этого Django использует традиционные единицы (KB, MB, GB и т.д.), которые чаще используются.

first

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

Например:

{{ value|first }}

Если value является списком ['a', 'b', 'c'], вывод будет 'a'.

floatformat

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

value Шаблон Вывод
34.23234 {{ value|floatformat }} 34.2
34.00000 {{ value|floatformat }} 34
34.26000 {{ value|floatformat }} 34.3

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

value Шаблон Вывод
34.23234 {{ value|floatformat:3 }} 34.232
34.00000 {{ value|floatformat:3 }} 34.000
34.26000 {{ value|floatformat:3 }} 34.260

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

value Шаблон Вывод
34.23234 {{ value|floatformat:"0" }} 34
34.00000 {{ value|floatformat:"0" }} 34
39.56000 {{ value|floatformat:"0" }} 40

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

value Шаблон Вывод
34.23234 {{ value|floatformat:"-3" }} 34.232
34.00000 {{ value|floatformat:"-3" }} 34
34.26000 {{ value|floatformat:"-3" }} 34.260

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

force_escape

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

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

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

get_digit

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

Например:

{{ value|get_digit:"2" }}

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

iriencode

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

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

Например:

{{ value|iriencode }}

Если value равно "?test=1&me=2", вывод будет "?test=1&amp;me=2".

join

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

Например:

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

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

last

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

Например:

{{ value|last }}

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

length

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

Например:

{{ value|length }}

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

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

length_is

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

Например:

{{ value|length_is:"4" }}

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

linebreaks

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

Например:

{{ value|linebreaks }}

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

linebreaksbr

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

Например:

{{ value|linebreaksbr }}

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

linenumbers

Отображает текст с номерами строк.

Например:

{{ value|linenumbers }}

Если value равно:

one
two
three

Вывод будет:

1. one
2. two
3. three

ljust

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

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

Например:

"{{ value|ljust:"10" }}"

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

lower

Преобразует строку в строчные буквы.

Например:

{{ value|lower }}

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

make_list

Возвращает значение, преобразованное в список. Для строки – список символов. Для целого числа аргумент преобразуется в строку 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" }}.

Примечание

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

pprint

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

random

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

Например:

{{ value|random }}

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

removetags

Устаревшее начиная с версии 1.8: removetags не может гарантировать безопасность вывода HTML и было устаревшим из-за проблем с безопасностью. Вместо него рассмотрите использование bleach.

Удаляет из вывода список [X]HTML-тегов, разделённых пробелом.

Например:

{{ value|removetags:"b span" }}

Если value является "<b>Joel</b> <button>is</button> a <span>slug</span>", необработанный вывод будет "Joel <button>is</button> a slug".

Обратите внимание, что этот фильтр чувствителен к регистру.

Если value является "<B>Joel</B> <button>is</button> a <span>slug</span>", необработанный вывод будет "<B>Joel</B> <button>is</button> a slug".

Гарантия безопасности отсутствует

Обратите внимание, что removetags не даёт никаких гарантий о безопасности вывода HTML. В частности, он не работает рекурсивно, поэтому входные данные типа "<sc<script>ript>alert('XSS')</sc</script>ript>" не будут безопасными, даже если вы примените |removetags:"script". Поэтому, если входные данные предоставлены пользователем, НИКОГДА не применяйте фильтр safe к выводу removetags. Если вам требуется более надёжный инструмент, вы можете использовать библиотеку Python bleach, в частности, метод clean.

rjust

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

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

Например:

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

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

safe

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

Примечание

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

{{ var|safe|escape }}

safeseq

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

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

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

slice

Возвращает фрагмент списка.

Использует ту же синтаксис, что и срезы списков в Python. См. http://www.diveintopython3.net/native-datatypes.html#slicinglists для ознакомления.

Пример:

{{ some_list|slice:":2" }}

Если some_list является ['a', 'b', 'c'], вывод будет ['a', 'b'].

slugify

Преобразует в ASCII. Заменяет пробелы на дефисы. Удаляет символы, которые не являются буквенно-цифровыми, символами подчеркивания или дефисами. Преобразует в нижний регистр. Также удаляет начальные и конечные пробелы.

Например:

{{ value|slugify }}

Если value является "Joel is a slug", вывод будет "joel-is-a-slug".

stringformat

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

См. https://docs.python.org/library/stdtypes.html#string-formatting-operations для документации по форматированию строк 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. Если вам требуется более надёжный инструмент, вы можете использовать библиотеку Python bleach, в частности, метод clean.

time

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

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

Например:

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

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

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

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

{{ value|time:"TIME_FORMAT" }}

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

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

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

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

{{ value|time }}

… будет использоваться строка форматирования, определённая в настройке TIME_FORMAT, без применения локализации.

Возможность получения и обработки значений с присоединённой информацией о часовом поясе была добавлена в Django 1.7.

timesince

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

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

{{ blog_date|timesince:comment_date }}

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

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

timeuntil

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

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

{{ conference_date|timeuntil:from_date }}

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

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

title

Преобразует строку в заголовок, делая первые буквы слов заглавными, а остальные — строчными. Этот тег не пытается сохранить «тривиальные слова» в нижнем регистре.

Например:

{{ value|title }}

Если value является "my FIRST post", вывод будет "My First Post".

truncatechars

Усекает строку, если она длиннее указанного числа символов. Усечённые строки будут заканчиваться переводимой последовательностью многоточия («…»).

Аргумент: Число символов, до которых нужно усечь

Например:

{{ value|truncatechars:9 }}

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

truncatechars_html

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

Например:

{{ value|truncatechars_html:9 }}

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

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

truncatewords

Усекает строку после определённого числа слов.

Аргумент: Число слов, после которых нужно усечь

Например:

{{ value|truncatewords:2 }}

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

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

truncatewords_html

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

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

Например:

{{ value|truncatewords_html:2 }}

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

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

unordered_list

Рекурсивно принимает самовложенный список и возвращает HTML-неупорядоченный список — БЕЗ открывающих и закрывающих тегов <ul>.

Предполагается, что список имеет правильный формат. Например, если var содержит ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']], то {{ var|unordered_list }} вернёт:

<li>States
<ul>
        <li>Kansas
        <ul>
                <li>Lawrence</li>
                <li>Topeka</li>
        </ul>
        </li>
        <li>Illinois</li>
</ul>
</li>

Устарело начиная с версии 1.8: Также поддерживается более старый, более ограниченный и подробный формат входных данных: ['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]. Поддержка этого синтаксиса будет удалена в Django 1.10.

upper

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

Например:

{{ value|upper }}

Если value равно "Joel is a slug", то результатом будет "JOEL IS A SLUG".

urlencode

Экранирует значение для использования в URL.

Например:

{{ value|urlencode }}

Если value равно "http://www.example.org/foo?a=b&c=d", то результатом будет "http%3A//www.example.org/foo%3Fa%3Db%26c%3Dd".

Можно указать необязательный аргумент, содержащий символы, которые не нужно экранировать.

Если он не указан, считается, что символ ‘/’ безопасен. Можно указать пустую строку, если все символы нужно экранировать. Например:

{{ value|urlencode:"" }}

Если value равно "http://www.example.org/", то результатом будет "http%3A%2F%2Fwww.example.org%2F".

urlize

Преобразует URL-адреса и адреса электронной почты в тексте в нажимаемые ссылки.

Этот тег шаблона работает со ссылками, начинающимися с http://, https://, или www.. Например, http://goo.gl/aia1t будет преобразован, но goo.gl/aia1t — нет.

Он также поддерживает ссылки только на домен, заканчивающиеся одним из оригинальных доменных имен верхнего уровня (.com, .edu, .gov, .int, .mil, .net, и .org). Например, djangoproject.com преобразуется.

Добавлена поддержка ссылок только на домен, которые включают символы после доменного имени верхнего уровня (например, djangoproject.com/ и djangoproject.com/download/).

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

Ссылки, сгенерированные urlize, имеют добавленный атрибут rel="nofollow".

Например:

{{ value|urlize }}

Если value равно "Check out www.djangoproject.com", то результатом будет "Check out <a href="http://www.djangoproject.com" rel="nofollow">www.djangoproject.com</a>".

Помимо веб-ссылок, urlize также преобразует адреса электронной почты в ссылки mailto:. Если value равно "Send questions to foo@example.com", то результатом будет "Send questions to <a href="mailto:foo@example.com">foo@example.com</a>".

Фильтр urlize также принимает необязательный параметр autoescape. Если autoescape равно True, текст ссылки и URL будут экранированы с помощью встроенного фильтра Django escape. Значение по умолчанию для autoescape равно True.

Примечание

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

urlizetrunc

Преобразует URL-адреса и адреса электронной почты в нажимаемые ссылки, как и urlize, но усекает URL, длина которых превышает заданный лимит символов.

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

Например:

{{ value|urlizetrunc:15 }}

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

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

wordcount

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

Например:

{{ value|wordcount }}

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

wordwrap

Усекает слова на указанную длину строки.

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

Например:

{{ value|wordwrap:5 }}

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

Joel
is a
slug

yesno

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

Например:

{{ value|yesno:"yeah,no,maybe" }}
Значение Аргумент Выходные данные
True yes
True "yeah,no,maybe" yeah
False "yeah,no,maybe" no
None "yeah,no,maybe" maybe
None "yeah,no" no (преобразует None в False если отображение для None не задано)

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

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

i18n

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

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

l10n

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

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

tz

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

См. Часовые пояса в шаблонах.

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

Django поставляется с несколькими другими библиотеками тегов и фильтров шаблонов, которые нужно явно включить в настройку INSTALLED_APPS и включить в шаблоне с помощью тега {% load %}.

django.contrib.humanize

Набор фильтров Django шаблонов, полезных для добавления «человеческого» прикосновения к данным. См. django.contrib.humanize.

static

static

Для ссылки на статические файлы, сохранённые в STATIC_ROOT Django поставляется с тегом шаблона static. Вы можете использовать его независимо от того, используете ли вы RequestContext или нет.

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

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

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

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

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

Примечание

Приложение staticfiles также поставляется с тегом static template tag, который использует staticfiles' STATICFILES_STORAGE для построения URL заданного пути (вместо простого использования urllib.parse.urljoin() со значением STATIC_URL и заданным путем). Используйте его вместо этого, если у вас есть продвинутый случай использования, такой как использование облачной службы для обслуживания статических файлов:

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

get_static_prefix

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

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

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

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

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

get_media_prefix

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

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

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

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

Spec-Zone.ru

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