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

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

Ответ 2

Использование block.super отлично работает при расширении шаблона, но не при его включении, т.е.

{% extends "base.html" %} vs. {% include "partial.html" %}

Предположим, вы хотите добавить шаблон в середине своей страницы, а также хотите добавить некоторый javascript в блок в конце страницы: вызовет block.super в включенном шаблоне.

Cf. 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. Да, в классе django используется класс Media, но на самом деле это не так хорошо работает. Обычно сторонники-фронтмены хотят принять решение о включении css и javascript файлов, и они не хотят редактировать файлы Python для изменения, и я также не хочу, чтобы они меняли мои файлы Python. Для этого необходимо было разрешить вам редактировать содержимое шаблонов, которые находятся до или после точки, в которой вы сейчас находитесь. Также я хотел, чтобы дубликаты были удалены. В результате я написал django-sekizai, который делает именно это. Он похож на блоки, вместо того, чтобы наследовать их, вы расширяете их.