Link Search Menu Expand Document

Пользовательские теги шаблона

Существуют два типа тегов: Simple tags и Inclusion tags

Simple tags

Для того чтобы многократно не вызываь однотипные функции (например: categories = Category.objects.all()) при выводе различных частей модуля (в файле views.py) мы можем использовать пользовательские теги шаблона

Для создания пользовательского тега шаблонов необходимо в папке необходимого модуля (Например news) добавить папку templatetags с пустым файлом __init__.py и уже в этой папке создаем файл тегов (news_tags.py) со следующим кодом:

from django import template
from news.models import Category
register = template.Library()  # регистрируем тэг

@register.simple_tag(name='get_list_categories')
def get_categories():
	return Category.objects.all()

Далее в необходимом шаблоне мы вызываем наш новый файл {% load news_tags %} и присваеваем переменной значение нужной нам функции {% get_categories as categories%}:

{% load news_tags %}
<div class="list-group">
    {% get_list_categories as categories%}
    {% for item in categories %}
    <a href="{% url 'category' item.pk %}" class="list-group-item list-group-item-action">{{ item.title }}</a>
    {% endfor %}
</div>

После этого мы уже можем из файла views.py удалить categories = Category.objects.all()

Inclusion tags

В этом случае мы уже сами рендерим необходимый шаблон. Для примера создадим в папке news/templates/news/list_categories.html:

<div class="list-group">
    {% for item in categories %}
    <a href="{% url 'category' item.pk %}" class="list-group-item list-group-item-action">{{ item.title }}</a>
    {% endfor %}
</div>

В файле news_tegs.py:

@register.inclusion_tag('news/list_categories.html')  # Указываем путь до шаблона
def show_categories():
	categories = Category.objects.all()
	return {'categories': categories }

Затем в нужном месте шаблона выводим уже отрендеренную часть шаблона: {% show_categories %}

Также мы можем передавать аргументы в Inclusion tags:def show_categories(arg1 = 'Hello', arg2 = 'World'):. Тут мы задаем стандартные значения переменным.

Изменить переменные можно так: {% show_categories arg2='User' %}

Выводятся данные переменные в шаблоне следующим образом: {{ arg1 }}