Как создать шаблон многократного использования в Django?
Что такое способ создания шаблона многократного использования Django?
Пример: Предположим, что на многих моих страницах содержится окно "Последние новости" и следуя принципу DRY, я хотел бы определить его один раз и повторно использовать его на других страницах. Как мне сделать это с помощью шаблонов Django (или Jinja2)?
Чтение через Документация по шаблонам Django У меня создается впечатление, что шаблоны Django предлагают наследование сверху вниз, где сам подшаблон определяет, в каком супер-шаблоне он будет внедрен:
<!-- Super-template (not valid, for illustration): -->
<html>
<head><title>Title</title></head>
<body>{% block content %}{% endblock %}</body>
</html>
<!-- Sub-template: -->
{% extends "base.html" %}
{% block content %}
<div class="latest-news">News</div>
{% endblock %}
Итак, какова методика повторного использования блока (подматрица) в нескольких местах?
Ответы
Ответ 1
Самый гибкий способ повторного использования фрагментов шаблона - определить include_tag. Вы можете передавать аргументы в свой собственный тег, обрабатывать их немного в Python, а затем возвращаться к шаблону. Прямое включение работает только для фрагментов, которые не зависят от окружающего контекста.
Быстрый пример из документов:
В app/templatetags/poll_extras.py
зарегистрируйте тег с украшением:
from django import template
register = template.Library()
@register.inclusion_tag('results.html')
def show_results(poll):
choices = poll.choice_set.all()
return {'choices': choices}
В app/templates/results.html
:
<ul>
{% for choice in choices %}
<li> {{ choice }} </li>
{% endfor %}
</ul>
Вызов тега:
{% load poll_extras %}
{% show_results poll %}
Ответ 2
Если вам нужно использовать {% block %}
, вы можете сделать это только с помощью подхода {% extend %}
. В противном случае вы можете использовать {% include 'some.html' %}
, чтобы включить немного HTML в несколько мест.
Ответ 3
Что вы ищете, {% include "template.html"%}
из Django docs.
Ответ 4
Неофициальные Соглашения о совместимости Django Reusable рекомендуют использовать эти имена блоков:
-
{% block title %}
-
{% block extra_head %}
-
{% block body %}
-
{% block menu %}
-
{% block content %}
-
{% block content_title %}
-
{% block header %} {% block footer %}
-
{% block body_id %} {% block body_class %}
-
{% block [section]_menu %} {% block page_menu %}
Если все придерживаются этих соглашений, это должно облегчить эту проблему. Следуйте ссылке, чтобы увидеть описание каждого блока.
Ответ 5
Aïe, моя ошибка - ответ указан в Django Reference (и не обсуждался в вышеупомянутом Документация по шаблонам Django)...
Итак: просто используйте {% include sub_template_name %}
.