Из view-функции в шаблон в словаре context передаются данные, которые необходимо встроить в HTML-страницу. При необходимости эти данные можно обработать прямо в шаблоне. Для этого есть фильтры: они обрабатывают значения переменных или аргументов других тегов.
Фильтр length
Фильтр length
вернёт длину строки или последовательности, переданной в переменной variable
. В коде фильтры присоединяются к имени переменной через символ |
:
{{ variable|length }}
Если в переменную variable
передать слово «python», то в шаблон будет выведено число 6, по числу букв в слове.
Фильтр safe
Если в шаблон передать строку с HTML-тегами и вывести её на страницу, то HTML-теги повылезают наружу и отобразятся как обычный текст.
# views.py
...
def poem(request):
text = ('Вчера Крокодил<br>улыбнулся так злобно,<br>Что мне до сих '
'пор<br>за него неудобно.<br><i>Рената Муха</i>'
)
context = {'text': text}
render(request, 'poem.html', context)
<!-- poem.html -->
<h2>Стихотворение</h2>
{{ text }}
Пользователю вернётся такая страница:

Чтобы HTML-теги не вываливались на страницу, а выполняли своё предназначение (форматировали и структурировали страницу), в шаблоне необходимо применять фильтр safe
:
<h2>Стихотворение</h2>
{{ text|safe }}
И страница будет выглядеть так:

Фильтр linebreaksbr
При работе в текстовом редакторе начало новой строки обычно обозначают нажатием Enter/Return, но HTML игнорирует такой перенос строк: текст будет будет выведен на HTML-страницу одной строкой. Перенос строк в HTML обозначается тегом <br>
.В Django Templates есть фильтр linebreaksbr
. Он заменяет символы перевода строки \n
на HTML-теги <br>
.
Фильтр date
Фильтр date
работает только с объектами типа date
и datetime
: он форматирует дату по маске. За основу взят стандарт, принятый в языке программирования PHP.Если вывести дату без форматирования, то получится что-то вроде '2019-02-02 00:00:00+00:00'
. Это не лучший вариант: длинно, некрасиво и много лишней информации. Фильтр date
позволяет вывести дату в любой форме:
{{ pub_date|date:"j.m.Y" }} {# выведет 2.02.2020 #}
{{ pub_date|date:"j F Y" }} {# выведет 2 Февраля 2020 #}
{{ pub_date|date:"d.m.y" }} {# выведет 02.02.20 #}
{{ pub_date|date:"d M Y" }} {# выведет 02 Фев 2020 #}
{{ post.pub_date|date:"d E Y" }} {# выведет 2 февраля 2020 #}
Несколько фильтров сразу
Фильтры можно объединять в цепочку:
{{ variable|title|truncatewords:4 }}
Если переменная variable
содержит строку ЭТО ОДиН маЛЕНЬкий шаг для чеЛОВека и оГрОмНыЙ СКачОК для челоВЕЧЕсТВАа
, то:
- сначала фильтр
title
преобразует регистр букв в формат «каждое слово с заглавной» (Это Один Маленький Шаг Для Человека И Огромный Скачок Для Человечества
), - а потом фильтр
truncatewords:4
обрежет текст до первых четырёх слов.
В результате на страницу будет выведено Это Один Маленький Шаг
. В Django есть ещё множество встроенных фильтров, почитайте о них в документации, это обязательно пригодится. В Django есть много встроенных тегов, но их можно создать и самостоятельно.