Django inclusion_tag с разными шаблонами
Столкнулся с такой задачей: есть пользовательский Inclusion Tags который выводит, например, список трех последних постов блога. Этот тег использует для вывода свой HTML шаблон, который потом используется для формирования шаблона сайта.
Но кроме вывода последних постов на страницу сайта, я хочу использовать этот же тег для вывода последних постов в HTML шаблон моей почтовой рассылки. Но шаблон почтовой рассылки отличается от шаблона страницы, а соответственно HTML шаблон моего тега тоже о отличается.
Т.е. в двух словах, как сделать возможность выбора шаблона при использовании inclusion_tag Django? Ниже описано мое решение.
Итак, наш «включающий тег» show_last_posts:
@register.inclusion_tag('blog/my_tags/last_posts.html')
def show_last_posts():
posts = Post.objects.all()[:3]
return {'posts': posts}
Сейчас при использовании этого тега, для вывода используется шаблон last_posts.html:
{# Шаблон для вывода трех последних постов в шаблон сайта#}
{% for post in posts %}
<h3>{{ post.title }}</h3>
{% endfor %}
Чтобы вывести содержания тега в шаблоне сайта загружаем наши теги {% load my_tags %}
и в нужном месте шаблона сайта вставляем сам тег:
{% show_last_posts %}
Теперь я хочу выводить тем же способом последние посты в HTML шаблоне для почтовой рассылки (или рассылки в Телеграм), НО для рассылки моя html разметка отличается и шаблон тега last_posts.html не подойдет.
Поэтому немного изменим наш пользовательский тег show_last_posts добавив к нему возможность выбора используемого шаблона:
@register.inclusion_tag('blog/my_tags/mockup.html')
def show_last_posts(tag_template):
posts = Post.objects.all()[:3]
return {'tag_template': tag_template, 'posts': posts}
Далее создадим рядом с шаблоном тега last_posts.html создаем еще один шаблонный файл mockup.html следующего содержания:
{% extends tag_template %}
И теперь при вызове тега можно указывать его шаблон, например вызовем тег с шаблоном last_posts.html, который уже использовали:
{% show_last_posts 'blog/my_tags/last_posts.html' %}
Для рассылки создадим отдельный шаблон blog/my_tags/last_posts_for_mail.html:
{# Шаблон для вывода трех последних постов в шаблон рассылки#}
<ul>
{% for post in posts %}
<li>{{ post.title }}</li>
{% endfor %}
</ul>
Для его использования, просто указываем его при вызове тега
{% show_last_posts 'blog/my_tags/last_posts_for_mail.html' %}
Вот и все. Я решил эту задачу таким образом, может быть в Джанге есть стандартная возможность использовать разные шаблоны для inclusion_tag, но я что-то ее не нашел.