Ответы:
{% block javascript %}
{{ block.super }}
... more content ...
{% endblock %}
Использование block.super
работает нормально при расширении шаблона, но не так хорошо при его включении, например:
{% extends "base.html" %} vs. {% include "partial.html" %}
Предположим, вы хотите включить шаблон в середину страницы, и вы также хотите добавить некоторый javascript в блок в конце страницы: вызов block.super
включенного шаблона приведет к сбою.
Ср Django выпускает # 7324 , # 12008 , # 13399 и соответствующее обновление документации . Ср включить примечание тега :
Тег include следует рассматривать как реализацию «визуализации этого подшаблона и включения HTML», а не «синтаксического анализа этого подшаблона и включения его содержимого, как если бы он был частью родительского элемента». Это означает, что между включенными шаблонами нет общего состояния - каждое включение - это полностью независимый процесс рендеринга.
Перед включением блоки оцениваются. Это означает, что шаблон, который включает блоки из другого, будет содержать блоки, которые уже были оценены и обработаны, а не блоки, которые могут быть переопределены, например, расширяющимся шаблоном.
В этом случае я бы рекомендовал использовать django-sekizai , который позволяет делать такие вещи, как:
{% load sekizai_tags %}
⎧ <p>Some content</p>
<p>Some content</p> | {% addtoblock "js" %}
| <script type="text/javascript">
{% include "partial.html" %} -> ⎨ alert("Hello django-sekizai");
| </script>
<p>Some more content</p> ⎩ {% endaddtoblock %}
{% render_block "js" %}
Основной причиной, по которой я начал этот проект, было отсутствие хорошего медиа (css / js) фреймворка в django и django-cms. Да, есть класс Media, используемый в формах в django, но на самом деле это не так хорошо работает. Обычно ребята, работающие с фронтендом, хотят решить, какие файлы css и javascript будут включены, и они не хотят, чтобы им приходилось редактировать файлы Python для изменения, и я не хотел, чтобы они меняли мои файлы Python. Поэтому возникла необходимость разрешить вам редактировать содержимое шаблонов, которые находятся до или после точки, в которой вы находитесь сейчас. Также я хотел удалить дубликаты. В результате я написал django-sekizai, который делает именно это. Это похоже на блоки, только вместо того, чтобы наследовать их, вы их расширяете.