Тест для существования шаблонного блока в шаблоне

У меня есть структура, где обычно существует страница, направляющаяся в (% block heading %} в моем основном шаблоне:

base.html

<h2>{% block heading %}{% endblock %}</h2>

Большую часть времени я передам в заголовке как это через шаблоны, которые расширяют основу:

extends-base.html

{% block heading %}Super Cool Page!{% endblock %}

Однако для специальной страницы, я не хочу иметь заголовок страницы:

extends-base-special.html

{% block heading %}{% endblock %}

Идеально, это должно исключить <h2> теги. Теперь, я мог просто заставить все расширяющиеся шаблоны включать <h2> теги, но это нарушает DRY, поскольку каждая страница должна иметь тот же элемент для заголовка уровня страницы. То, что я предпочел бы делать, является этим (который, кажется, не работает):

base-prefered.html

{% if heading %}
<h2>{% block heading %}{% endblock %}</h2>
{% endif %}

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

17
задан Svante 9 January 2010 в 23:43
поделиться

2 ответа

Вы можете дважды упаковать его

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

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

{% block noheader %}{% endblock %}
31
ответ дан 30 November 2019 в 11:52
поделиться

Делаем так:

  • base.html - вся структура

    {% заголовок блока %}{% endblock %}

  • base-outt-heading.html - расширяем базу этим {% заголовок блока %}{% endblock %}

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

И кстати. Записывая:

{% if heading %}

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

4
ответ дан 30 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: