Создание фильтров шаблонизатора Django
Джанго имеет множество встроенных фильтров в шаблонизаторе, позволяющих изменять переменные в шаблонах. Это функции Python, которые принимают один или два параметра — значение переменной, к которой она применяется, и необязательный аргумент. Они возвращают значение, которое может отображаться или обрабатываться другим фильтром. Фильтр выглядит так, как {{ variable|my_filter }}
или передавая аргумент, он выглядит как {{ variable|my_filter:"foo" }}
. Можно применить любое количество фильтров, например {{ variable|filter1|filter2 }}
, и каждый из них будет применен к значению, созданному предыдущим фильтром.
Мы собираемся создать пользовательский фильтр для использования синтаксиса markdown в наших записях блога. Markdown — это простой синтаксис форматирования текста, который очень прост в использовании. Основы этого формата можно узнать здесь http://daringfireball.net/projects/markdown/basics
Сначала установите модуль Python markdown через pip, используя следующую команду:
pip install Markdown==2.6.2
Давайте отредактируем файл blog_tags.py и внесем в него следующий код:
from django.utils.safestring import mark_safe
import markdown
@register.filter(name='markdown')
def markdown_format(text):
return mark_safe(markdown.markdown(text))
Мы объявляем фильтры шаблонов так же, как и теги шаблонов. Чтобы избежать коллизий между именем функции и модулем markdown, мы называем функцию markdown_format и называем фильтр markdown для использования в шаблонах, таких как {{ variable|markdown }}
. Джанго выполняет escape-код HTML, генерируемый фильтрами. Мы используем функцию mark_safe, предоставляемую Джанго, чтобы пометить результат как безопасный HTML для визуализации в шаблоне. По умолчанию, Джанго не пропустит ни однин HTML-код. Единственным исключением являются переменные, помеченные как безопасные. Такое поведение предотвращает появление потенциально опасного HTML-кода и позволяет создавать исключения, когда вы знаете, что вы возвращаете безопасный HTML-код.
Теперь загрузите модуль тегов шаблонов в post list и post detail. Добавьте следующую строку в начало шаблона post/list.html and post/detail.html после тега {% extends %}
:
{% load blog_tags %}
В шаблоне post/detail.html измените следующую строку:
{{ post.body|linebreaks }}
На:
{{ post.body|markdown }}
В шаблоне post/list.html найдите строку:
{{ post.body|truncatewords:30|linebreaks }}
И измените ее на:
{{ post.body|markdown|truncatewords_html:30 }}
Фильтр truncatewords_html обрезает строку после определенного числа слов, избегая незакрытых тегов HTML.
Теперь откройте в браузере http://127.0.0.1:8000/admin/blog/post/add/ и добавьте пост со следующим содержимым:
This is a post formatted with markdown
--------------------------------------
*This is emphasized* and **this is more emphasized**.
Here is a list:
* One
* Two
* Three
And a [link to the Django website](https://www.djangoproject.com/)
Теперь перейдите в эту запись и посмотрите что у нас получилось:
Как можно видеть, пользовательские фильтры шаблонов очень полезны для настройки форматирования. Дополнительные сведения о пользовательских фильтрах можно найти здесь https://docs.djangoproject.com/en/1.8/howto/custom-template-tags/\#writing-custom-template-filters