Подтвердить что ты не робот

Django: использование блоков в включенных шаблонах

У меня есть некоторые html-структуры, которые повторно используются в нескольких разных местах. Он отличается от общего шаблона, поэтому я не могу его расширять, его также можно использовать для содержания сложного контента, поэтому я не думаю, что его определение как тега шаблона делает хорошую работу. Ниже приведен некоторый псевдо-код, описывающий мой желаемый результат. При использовании template_level2.html вы можете легко вставить материал в reusable_pattern_template, вызвав внутри него блок. Если я действительно использую этот код, то то, что вы пишете в "фактическом содержимом" template_level_2.html, не появится. Как мне с этим бороться?

base.html

<html>
<head></head>
<body>
{% block content %}{% endblock %}
</body>
</html>

template_level1.html

{% extends 'base.html' %}
{% block content %}
  Something here...
  {% include 'reusable_pattern_template.html' %}
  Something else here...
{% endblock %}

reusable_pattern_template.html

<div>
  <div>
    <div>
      {% block local_content %}{% endblock %}
    </div>
   </div>
</div>

template_level2.html

{% extends 'template_level1.html' %}
{% block local_content %}
  Actual content here...
{% endblock %}

обновление: Извините, расширений в template_level2.html есть некоторая орфографическая ошибка, я только что ее исправил.

Это может быть не совсем понятно, но вышеприведенный код скорее псевдо-кода, описывающего мой желаемый результат. Короче говоря,

  • Я хотел бы включить небольшие куски многоразовых шаблонов html в мой шаблоны.
  • Эти шаблоны похожи на ящики, которые вы можете поместить целые куски html содержание в них. Поэтому переменные контекста могут быть слишком ограниченными для моя цель
4b9b3361

Ответ 1

Django не обрабатывает блоки во входящих файлах.

Тег include следует рассматривать как реализацию "рендеринга этого подтема и включить HTML", а не как "проанализировать этот подтема и включить его содержимое, как если бы он был частью родителя". Это означает, что между включенными шаблонами не существует общего состояния - каждый из них является полностью независимым процессом рендеринга. (Документация по шаблону шаблонов Django)

Ответ 2

Кажется, что последний шаблон пытается расширить себя (если он был в кавычках).

Вам действительно не нужна такая сложность. Это на самом деле намного проще.

Базовый шаблон должен содержать скелет вашего шаблона, затем вы можете его расширить, чтобы выполнить настройки. Для многократных кодовых блоков, которые вы не хотите включать в каждое ваше представление, include их там, где это необходимо, но не используйте никаких операторов block, extends или include во включенном файле. Django не будет анализировать те, но context variable, переданный из представления, все еще можно использовать.

Ответ 3

Вы можете разбить reusable_pattern_template на начальные и конечные шаблоны. Затем в level1 вы можете включить begin, block, include end.

В качестве альтернативы вы можете передать имя шаблона в reusable_pattern_template в качестве контекстной переменной, а затем включить его в reusable_pattern_template. Это потребует изменения отношения между уровнями 1 и 2 в вашем примере, но, как правило, более мощным.