Джанго шаблон включает в себя - PullRequest
3 голосов
/ 11 мая 2009

У меня сейчас проблема с шаблонами django. У меня есть 3 файла шаблона в основном:

  • База
  • story_list
  • story_detail

Story_list и _detail расширяют базу, и это прекрасно работает. Тем не менее, список и детализация разделяют некоторый код, который расширяет базовый шаблон для моей боковой панели. Я в основном повторяю кусок кода в обоих шаблонах, и программист во мне говорит, что это просто неправильно. Должен быть лучший способ, я в этом уверен. Я пробовал включает, однако у меня есть во включенном файле:

{% block item %}
    content stuff
{% endblock %}

около 3-х блоков. Проблема в том, что ничего из этого не берется / отображается. Если я включаю файл в секцию блока, которая расширяет базу, то он все удаляет правильно, но если я не включаю его в блок, я ничего не получаю. SSI - это путь? Я играл с этим, но это тоже не сработало. Любая помощь приветствуется.

Ответы [ 4 ]

16 голосов
/ 11 мая 2009

Как правило, использование include s не подходит для шаблонов Django. Позвольте мне ответить на ваш вопрос по нескольким направлениям.

Во-первых, позвольте мне обратиться к боковой панели.

  • Почти все ли общие страницы будут использовать эту боковую панель? Вставьте ее в Base. Не переопределяйте эти блоки боковой панели (то есть вообще не пишите их в шаблонах Story_*).

  • Является ли эта боковая панель уникальной для шаблонов Story_*? Создайте еще один шаблон, скажем, Story_base и расширьте его. Это сродни созданию абстрактного суперкласса в Java. (Ответ был у меня в голове, но формулировка была безжалостно сорвана с jpwatts.)

Далее, позвольте мне обратиться к наследованию шаблона. Скажем, у вас есть шаблон с именем Story_list, который расширяет Base. На данный момент, после установки {% extends "Base" %}, Story_list будет точно Base. Все, что вы добавляете в Story_list, игнорируется, потому что шаблон уже завершен. Единственное, что вы можете сделать сейчас, это переопределить блоки, которые были определены в Base.

Наконец, позвольте мне обратиться к include с. Старайтесь всегда избегать их. Другие движки шаблонов, такие как PHP, рекомендуют использовать include s. Однако это может привести к менее управляемым шаблонам в долгосрочной перспективе. Немного сложнее взглянуть на включенный фрагмент и сразу определить его место в иерархии шаблонов. Их также сложнее реорганизовать в иерархию шаблонов, особенно если вы включите их на нескольких уровнях (один раз в Base, дважды в Story_base, один раз в некоторые из Story_* и т. Д.).

6 голосов
/ 11 мая 2009

Если между шаблонами историй есть общий код, который не нужен для всего сайта, я бы создал story_base (расширяющий исходный base), и мои шаблоны историй расширили бы его.

0 голосов
/ 20 января 2013
{% include xxx.html %}

Этот тег работает.

Альтернативным способом является использование фильтра. Фильтр вызывает функцию рендеринга, шаблон можно использовать при рендеринге.

0 голосов
/ 11 мая 2009

Для этого у вас есть тег {% include%} .

...