Можем ли мы добавить {% block%} вместо перезаписи? - PullRequest
105 голосов
/ 12 ноября 2009

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

Ответы [ 2 ]

181 голосов
/ 12 ноября 2009
{% block javascript %}
    {{ block.super }}
    ... more content ...
{% endblock %}

См .: Документация Django - Наследование шаблонов

8 голосов
/ 07 ноября 2016

Использование 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, который делает именно это. Это похоже на блоки, просто вместо того, чтобы наследовать их, вы расширяете их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...