Можем ли мы добавить к {% block%}, а не перезаписать?

116

В моем core.html есть блок с пометкой javascript. Было бы здорово, если бы я мог добавить больше строк в этот блок, не перезаписывая все в нем.

PKKid
источник

Ответы:

9

Использование 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" %}

Из django-sekizai README :

Основной причиной, по которой я начал этот проект, было отсутствие хорошего медиа (css / js) фреймворка в django и django-cms. Да, есть класс Media, используемый в формах в django, но на самом деле это не так хорошо работает. Обычно ребята, работающие с фронтендом, хотят решить, какие файлы css и javascript будут включены, и они не хотят, чтобы им приходилось редактировать файлы Python для изменения, и я не хотел, чтобы они меняли мои файлы Python. Поэтому возникла необходимость разрешить вам редактировать содержимое шаблонов, которые находятся до или после точки, в которой вы находитесь сейчас. Также я хотел удалить дубликаты. В результате я написал django-sekizai, который делает именно это. Это похоже на блоки, только вместо того, чтобы наследовать их, вы их расширяете.

Максим Р.
источник