Создание фильтров шаблонизатора 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

results matching ""

    No results matching ""