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

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

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

 {% stats_block user %}

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

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


person Alb Dum    schedule 27.08.2012    source источник
comment
что вы имеете в виду, говоря, что все в одну строку в теге шаблона? Если всю информацию можно прочитать через пользовательский объект, то технически это все, что вам нужно отправить в шаблон, и ваш тег шаблона будет содержать любой код для добавления дополнительных отфильтрованных значений в контекст шаблона.   -  person moopet    schedule 27.08.2012


Ответы (2)


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

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

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

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

Но лучший способ повторить блок во всех шаблонах — использовать базовый шаблон 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 %}

Дополнительные сведения см. в документации по наследованию шаблонов.

include_tag

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

person jpic    schedule 27.08.2012
comment
Это почти идеально, большое спасибо! Извините, я не могу проголосовать, потому что у меня еще недостаточно баллов на этом аккаунте :( - person Alb Dum; 27.08.2012
comment
Используйте другую учетную запись, тогда ахахаха. Я рад, что это помогло. - person jpic; 27.08.2012

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

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

person Rohan    schedule 27.08.2012