Как создать шаблон многократного использования в 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 %}

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