В моем core.html у меня есть блок с надписью javascript. Было бы здорово, если бы я мог добавить больше строк в этот блок, не перезаписывая в нем все.
Можно ли добавить {% block%} вместо перезаписи?
Ответ 1
{% block javascript %}
{{ block.super }}
... more content ...
{% endblock %}
Ответ 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" %}
Основная причина, по которой я начал этот проект, заключалась в отсутствии хорошей среды (css/js) в django и django-cms. Да, в классе django используется класс Media, но на самом деле это не так хорошо работает. Обычно сторонники-фронтмены хотят принять решение о включении css и javascript файлов, и они не хотят редактировать файлы Python для изменения, и я также не хочу, чтобы они меняли мои файлы Python. Для этого необходимо было разрешить вам редактировать содержимое шаблонов, которые находятся до или после точки, в которой вы сейчас находитесь. Также я хотел, чтобы дубликаты были удалены. В результате я написал django-sekizai, который делает именно это. Он похож на блоки, вместо того, чтобы наследовать их, вы расширяете их.