Ответ 1
Вы можете дважды обернуть его
{% block noheader %}
<h2>{% block header %}Super Cool Page!{% endblock header %}</h2>
{% endblock noheader %}
На страницах без заголовка
{% block noheader %}{% endblock %}
У меня есть структура, где обычно заголовок страницы в (% block heading %}
в базовом шаблоне:
base.html
<h2>{% block heading %}{% endblock %}</h2>
В большинстве случаев я передам заголовок, подобный этому, с помощью шаблонов, расширяющих базу:
простирается-base.html
{% block heading %}Super Cool Page!{% endblock %}
Однако для специальной страницы я не хочу иметь заголовок страницы:
расширяет база-special.html
{% block heading %}{% endblock %}
В идеале это должно исключать теги <h2>
. Теперь я могу просто сделать все расширяющиеся шаблоны тегами <h2>
, но это нарушает DRY, так как каждая страница должна иметь один и тот же элемент для заголовка уровня страницы. Я бы предпочел сделать это (что, похоже, не работает):
базовый prefered.html
{% if heading %}
<h2>{% block heading %}{% endblock %}</h2>
{% endif %}
Является ли это выполнимым каким-то образом на уровне шаблона, или мне нужно вставлять в него данные?
Вы можете дважды обернуть его
{% block noheader %}
<h2>{% block header %}Super Cool Page!{% endblock header %}</h2>
{% endblock noheader %}
На страницах без заголовка
{% block noheader %}{% endblock %}
Сделайте это так:
<h2>{% block heading %}{% endblock %}</h2>
{% block heading %}{% endblock %}
И затем либо расширьте первый, либо второй шаблон. Я считаю, что это должен быть самый простой способ.
И кстати. Написав:
{% if heading %}
вы полностью запрашиваете логическое значение элемента в контексте с названием "заголовок". Элементы django markup language arent хранятся в контексте, поэтому вы не можете их просить. Вы можете написать тег, который добавляет что-то в контекст, я когда-то нуждался в такой штуке и использовал ее, но я не верю, что путь сюда. Над решением должно работать (у меня нет машины, чтобы проверить это), и это лучший способ IMNSHO.
Afaik пока нет хорошего и простого решения. Помимо опции, предлагаемой czarchaic, вы также можете написать свой собственный тег шаблона, как описано в Jarret Hardie answer, чтобы Как протестировать использование блока шаблонов django?. Тем не менее, imho лучшим и самым элегантным способом будет тег шаблона {% capture as ... %}
- к сожалению, он еще не реализован: https://code.djangoproject.com/ticket/6378 p >