Я хотел бы предоставить один и тот же контент в двух разных базовых файлах.
Итак, я пытаюсь сделать это:
page1.html:
{% extends "base1.html" %}
{% include "commondata.html" %}
page2.html:
{% extends "base2.html" %}
{% include "commondata.html" %}
Проблема в том, что я не могу использовать как extends, так и include. Есть ли способ сделать это? А если нет, то как я могу это сделать?
commondata.html переопределяет блок, указанный как в base1.html, так и в base2.html.
Это делается для того, чтобы предоставить одну и ту же страницу в формате pdf и html, где форматирование немного отличается. Приведенный выше вопрос упрощает то, что я пытаюсь сделать, поэтому, если я смогу получить ответ, он решит мою проблему.
источник
Из документов Django:
Таким образом, Django не захватывает блоки из вашего commondata.html и не знает, что делать с визуализированными внешними блоками HTML.
источник
Это должно помочь вам: поместите тег include внутри блока.
page1.html:
page2.html:
источник
Подробнее о том, почему у меня это не сработало на случай, если это поможет будущим людям:
Причина, по которой он не работает, заключается в том, что {% include%} в django не любит специальные символы, такие как причудливый апостроф. Данные шаблона, которые я пытался включить, были вставлены из слова. Мне пришлось вручную удалить все эти специальные символы, а затем он успешно включился.
источник
Вы не можете вставлять блоки из включенного файла в дочерний шаблон, чтобы переопределить блоки родительского шаблона. Однако вы можете указать родительский элемент в переменной и указать базовый шаблон в контексте.
Из документации :
Вместо отдельных "page1.html" и "page2.html" поместите
{% extends base_template %}
вверху "commondata.html". А затем, на ваш взгляд, определитеbase_template
значение «base1.html» или «base2.html».источник
Добавлено для справки для будущих людей, которые найдут это через Google: вы можете посмотреть на тег {% overextend%}, предоставляемый библиотекой мезонина для подобных случаев.
источник
Изменить 10 декабря 2015 года : как указано в комментариях, ssi устарел с версии 1.8. По документации:
На мой взгляд, правильный (лучший) ответ на этот вопрос - от podshumok , поскольку он объясняет, почему поведение include при использовании вместе с наследованием.
Однако я был несколько удивлен, что никто не упомянул тег ssi, предоставляемый системой шаблонов Django, который специально разработан для встраивания, включая внешний фрагмент текста . Здесь inline означает, что внешний текст не будет интерпретироваться, анализироваться или интерполироваться, а просто «копируется» внутри вызывающего шаблона.
Пожалуйста, обратитесь к документации для получения дополнительной информации (не забудьте проверить свою версию Django в селекторе в нижней правой части страницы).
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi
Из документации:
Остерегайтесь также последствий для безопасности этого метода, а также необходимого определения ALLOWED_INCLUDE_ROOTS, которое необходимо добавить в ваши файлы настроек.
источник