Django - "Включить" блок в несколько шаблонов? Тег шаблона? Что-то другое?

У меня есть небольшой блок статистики, который я хочу быть доступным в нескольких местах: страница профиля пользователя и страница поиска со списком пользователей.

Каким будет лучший способ повторить этот блок? Я исхожу из PHP-фона, и в PHP было бы просто включить с простыми простыми аргументами. В django я в основном хочу называть что-то вроде:

 {% stats_block user %}

Где пользователь - это объект, содержащий всю информацию о пользователе. Я думал о простой тег шаблона, но блок довольно большой, и я не хочу помещать eveything в одну строку в теге шаблона.

Спасибо большое!

Ответ 1

включить тег шаблона

Вы можете включать шаблоны с аргументами:

{% include "name_snippet.html" with person="Jane" greeting="Hello" %}

Наследование шаблонов

Но лучший способ повторить блок во всех шаблонах - это иметь базовый шаблон say base.html:

<html>
...
    <div id="user-block">
        {% if request.user.is_authenticated %}
            hello {{ request.user }}
        {% else %}
            <a href="{% url acct_signup %}">Sign up!</a>
        {% endif %}
    </div>
 ...
    <div id="body">
        {% block body %}
        {% endblock %}
    </div>
 ...
 </html>

Например, шаблон контакта может быть таким же простым, как:

{% extends 'base.html' %}

{% block body %}
    Contact use: [email protected]
{% endblock %}

Подробнее см. документацию по наследованию шаблонов.

inclusion_tag

Наконец, еще один отличный вариант - сделать include_tag, что позволяет перехватывать обработку контекста python до фактического включения шаблона.

Ответ 2

Вы можете написать собственный тег шаблона, который может отображать определенный шаблон. Обратитесь теги включения.

Из ссылки: Другой распространенный тип тега шаблона - это тип, который отображает некоторые данные, создавая другой шаблон.