Как сделать многоразовый шаблон в Django? - PullRequest
20 голосов
/ 28 февраля 2012

Как в Django создать шаблон для повторного использования?

Пример: Предположим, что на многих моих страницах есть поле "Последние новости" и, следуя принципу СУХОЙ, я хотел бы определить его один раз и повторно использовать на других страницах. Как бы я сделал это с шаблонами 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 %}

Так, какова техника повторного использования блока (подшаблона) в нескольких местах?

Ответы [ 6 ]

27 голосов
/ 28 февраля 2012

Самый гибкий способ повторного использования фрагментов шаблона - определить тег включения_100 *. Вы можете передавать аргументы в свой пользовательский тег, немного обрабатывать их в 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 %}
12 голосов
/ 28 февраля 2012

То, что вы ищете, это {% include "template.html"%} из Django docs .

10 голосов
/ 28 февраля 2012

Если вам нужно использовать {% block %}, вы можете сделать это только с помощью подхода {% extend %}.В противном случае вы можете использовать {% include 'some.html' %}, чтобы включить немного HTML в нескольких местах.

3 голосов
/ 03 мая 2016

Неофициальные Соглашения об использовании повторно используемых приложений Django рекомендует использовать следующие имена блоков:

  • {% 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 %}

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

1 голос
/ 08 сентября 2018

Как уже упоминалось в других ответах, самый простой подход - это прямое включение:

{% include 'mytemplate.html' %}

Можно изменить контекст отображаемого шаблона (или, проще говоря, передать переменные в шаблон), используя

{% include 'mytemplate.html' with poll=poll %}

Чтобы использовать пример традиционного опроса, шаблон, который я бы написал, был бы:

<div class="stylish-poll">
{% for choice in poll.choices %} <!-- poll is a template variable -->
    {% include 'choice_template.html' with choice=choice %}
{% endfor %}
</div>

Другая потенциально полезная вещь, которую нужно знать, это то, что ключевое слово only предотвращает передачу переменной шаблона poll в 'choice_template.html', что было бы по умолчанию. Если вы не хотите, чтобы шаблон выбора имел доступ к {{ poll }}, то оператор включения выглядит следующим образом:

{% include 'choice_template.html' with choice=choice only %}

Документация: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#include

0 голосов
/ 28 февраля 2012

Да, моя вина - ответ дан в Справочнике Django (и не обсуждался в вышеупомянутой Документации по шаблону Django )…

Итак: просто используйте {% include sub_template_name %}.

...