Использование block.super
прекрасно работает при расширении шаблона, но не так хорошо при его включении, то есть:
{% extends "base.html" %} vs. {% include "partial.html" %}
Скажем, вы хотите включить шаблон в середину вашей страницы, и вам также хотелось бы, чтобы он добавил некоторый javascript в блок в конце страницы: вызов block.super
во включенном шаблоне приведет к сбою.
Cf. Django выпускает # 7324 , # 12008 , # 13399 и соответствующее обновление документации . Ср включает тег примечание:
Тег включения следует рассматривать как реализацию «рендеринга этого подшаблона и включения 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. Да, в django есть класс Media, используемый в формах, но на самом деле это не очень хорошо работает. Обычно ребята из внешнего интерфейса хотят принять решение о включении файлов CSS и Javascript, и им не нужно редактировать файлы Python, чтобы они менялись, и я не хотел, чтобы они меняли мои файлы Python. Для этого необходимо было разрешить вам редактировать содержимое шаблонов, которые находятся до или после точки, в которой вы находитесь сейчас. Также я хотел, чтобы дубликаты были удалены. В результате я написал django-sekizai, который делает именно это. Это похоже на блоки, просто вместо того, чтобы наследовать их, вы расширяете их.