Проверка наличия шаблона в шаблоне

У меня есть структура, где обычно заголовок страницы в (% 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 %}

Является ли это выполнимым каким-то образом на уровне шаблона, или мне нужно вставлять в него данные?

Ответ 1

Вы можете дважды обернуть его

{% block noheader %}
  <h2>{% block header %}Super Cool Page!{% endblock header %}</h2>
{% endblock noheader %}

На страницах без заголовка

{% block noheader %}{% endblock %}

Ответ 2

Сделайте это так:

  • base.html - целая структура <h2>{% block heading %}{% endblock %}</h2>
  • base-without-heading.html - расширьте базу с помощью этого {% block heading %}{% endblock %}

И затем либо расширьте первый, либо второй шаблон. Я считаю, что это должен быть самый простой способ.

И кстати. Написав:

{% if heading %}

вы полностью запрашиваете логическое значение элемента в контексте с названием "заголовок". Элементы django markup language arent хранятся в контексте, поэтому вы не можете их просить. Вы можете написать тег, который добавляет что-то в контекст, я когда-то нуждался в такой штуке и использовал ее, но я не верю, что путь сюда. Над решением должно работать (у меня нет машины, чтобы проверить это), и это лучший способ IMNSHO.

Ответ 3

Afaik пока нет хорошего и простого решения. Помимо опции, предлагаемой czarchaic, вы также можете написать свой собственный тег шаблона, как описано в Jarret Hardie answer, чтобы Как протестировать использование блока шаблонов django?. Тем не менее, imho лучшим и самым элегантным способом будет тег шаблона {% capture as ... %} - к сожалению, он еще не реализован: https://code.djangoproject.com/ticket/6378 p >