Django предлагает множество встроенных тегов шаблонов, таких как {% if %} или {% block %}. Вы использовали несколько из них в своих шаблонах.
Однако Django также позволяет создавать собственные теги шаблонов для выполнения пользовательских действий. Пользовательские теги шаблонов очень удобны, когда вам нужно добавить в свои шаблоны функциональность, которая не охватывается основным набором тегов шаблонов Django.Сила пользовательских тегов шаблонов заключается в том, что вы можете обрабатывать любые данные и добавлять их в любой шаблон независимо от выполняемого представления. Вы можете выполнять наборы запросов или обрабатывать любые данные для отображения результатов в шаблонах.
Django предоставляет следующие вспомогательные функции, которые позволяют легко создавать собственные теги шаблонов:
- simple_tag : Обрабатывает данные и возвращает строку
- inclusion_tag : Обрабатывает данные и возвращает отрисованный шаблон
- assignment_tag : Обрабатывает данные и устанавливает переменную в контексте
Теги шаблонов должны находиться внутри приложений Django.
Пусть Код начинается
Внутри вашего каталога django application создайте новый каталог, назовите его templatetags и добавьте пустой __init__.py
файл к нему. Создайте другой файл в той же папке и назовите его custom_tags.py
. Файловая структура приложения django должна выглядеть следующим образом:
djangoapp/ __init__.py models.py ... templatetags/ __init__.py custom_tags.py
Имя файла имеет важное значение. Вы собираетесь использовать имя этого модуля для загрузки тегов в шаблоны.
- Простой тег: Мы начнем с создания
простого тега
для получения общего количества объектов в нашей модели с именемВаша модель
. Редактировать custom_tags.py файл, который вы только что создали, и добавьте следующий код:
from django import template register = template.Library() from ..models import YourModel @register.simple_tag def any_function(): return YourModel.objects.count()
Как уже упоминалось выше, он обрабатывает данные и возвращает строку. Каждый модуль templatetags должен содержать переменную с именем register, чтобы быть допустимой библиотекой тегов. Эта переменная является экземпляром шаблона.Библиотека и она используется для регистрации ваших собственных тегов шаблонов и фильтров. Django будет использовать имя функции в качестве имени тега. Если вы хотите зарегистрировать его под другим именем, вы можете сделать это, указав атрибут имени, например @register.simple_tag(name='my_tag')
.
После добавления нового модуля тегов шаблонов вам потребуется перезапустить сервер разработки Django, чтобы использовать новые теги и фильтры шаблонов.
Перед использованием пользовательских тегов шаблона необходимо сделать их доступными для шаблона с помощью тега {% load%}. Как уже упоминалось ранее, вам необходимо использовать имя модуля Python, содержащего теги и фильтры вашего шаблона.
- Тег включения: На этот раз мы будем использовать тег включения. Используя тег включения, вы можете визуализировать шаблон с переменными контекста, возвращаемыми тегом шаблона. Отредактируйте
custom_tags.py
файл и добавьте следующий код:
@register.inclusion_tag('path_to_your_html_file.html') def any_function(): variable = YourModel.objects.order_by('-publish')[:5] return {'variable': variable}
Обратите внимание, что функция возвращает словарь переменных вместо простого значения. Теги включения должны возвращать словарь значений, который используется в качестве контекста для отображения указанного шаблона. Теги включения возвращают словарь .
- Тег назначения: Наконец, мы собираемся создать тег назначения . Теги назначения похожи на простые теги, но они хранят результат в заданной переменной. Редактировать custom_tags.py файл и добавьте в него следующий тег импорта и шаблона:
@register.assignment_tag def any_function(count=5): return *some database query*
Обозначение для тегов шаблона назначения – {% template_tag как переменная %}
. Мы можем использовать тег назначения в нашем html-файле, как показано ниже:
{% any_function as queries %}
-
{% for query in queries %}
- ... {% endfor %}
Использовать теги шаблонов в приложении django очень просто.