Реализация конкретно-прикладных шаблонных тегов
Django предоставляет следующие вспомогательные функции, которые позволяют легко создавать шаблонные теги:
-
simple_tag: обрабатывает предоставленные данные и возвращает строковый литерал; -
inclusion_tag: обрабатывает предоставленные данные и возвращает прорисованный шаблон.
Шаблонные теги должны находиться внутри приложений Django.
Внутри каталога приложения blog создайте новый каталог, назовите его templatetags и добавьте в него пустой файл __init__.py.
Создайте еще один файл в той же папке и назовите его blog_tags.py.
Файловая структура приложения blog должна выглядеть, как показано ниже:
Очень важно то, как файл называется. Вы будете использовать имя этого модуля для загрузки тегов в шаблоны.
Создание простого шаблонного тега
Давайте начнем с создания простого тега, чтобы получать общее число опубликованных в блоге постов.
Отредактируйте только что созданный вами файл templatetags/blog_tags.py, добавив следующий ниже исходный код:
from django import template
from ..models import Post
register = template.Library()
@register.simple_tag
def total_posts():
return Post.published.count()
Мы создали простой шаблонный тег, который возвращает число опубликованных в блоге постов.
Для того чтобы быть допустимой библиотекой тегов, в каждом содержащем шаблонные теги модуле должна быть определена переменная с именем register.
Эта переменная является экземпляром класса template.Library, и она используется для регистрации шаблонных тегов и фильтров приложения.
В приведенном выше исходном коде тег total_posts был определен с помощью простой функции Python. В функцию был добавлен декоратор @register.simple_tag, чтобы зарегистрировать ее как простой тег.
Django будет использовать имя функции в качестве имени тега. Если есть потребность зарегистрировать ее под другим именем, то это можно сделать, указав атрибут name, например @register.simple_tag(name='my_tag').
После добавления нового модуля шаблонных тегов потребуется перезапустить сервер разработки, чтобы новые теги и фильтры стали доступны для использования в шаблонах.
Прежде чем использовать конкретно-прикладные шаблонные теги, необходимо сделать их доступными для шаблона с помощью тега {% load %}. Как упоминалось ранее, нужно использовать имя модуля Python, содержащего ваши шаблонные теги и фильтры.
Отредактируйте шаблон templates/blog/base.html, добавив тег {% load blog_tags %} в верхней его части, чтобы загрузить свой модуль шаблонных тегов.
Затем примените созданный вами тег для отображения общего числа постов, как показано ниже:
{% load blog_tags %}
{% load static %}
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{% endblock %}</title>
<link href="{% static "css/blog.css" %}" rel="stylesheet">
</head>
<body>
<div id="content">
{% block content %}
{% endblock %}
</div>
<div id="sidebar">
<h2>My blog</h2>
<p>
This is my blog.
I've written {% total_posts %} posts so far.
</p>
</div>
</body>
</html>
Для того чтобы отслеживать добавленные в проект новые файлы, нужно перезапустить сервер.
Пройдите по URL-адресу http://127.0.0.1:8000/blog/ в своем браузере. На боковой панели вы должны увидеть общее число постов сайта, как показано ниже:
Шаблонные теги позволяют обрабатывать любые данные и добавлять их в любой шаблон независимо от исполняемого представления. При этом для отображения результатов в своих шаблонах можно выполнять наборы запросов или обрабатывать любые данные.