Тест на наличие блока шаблона в шаблоне - PullRequest
15 голосов
/ 10 января 2010

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

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

Ответы [ 3 ]

30 голосов
/ 10 января 2010

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

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

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

{% block noheader %}{% endblock %}
4 голосов
/ 10 января 2010

Сделай так:

  • base.html - вся структура <h2>{% block heading %}{% endblock %}</h2>
  • base-без-heading.html - расширить базу с этим {% block heading %}{% endblock %}

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

И, кстати. Письмо:

{% if heading %}

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

1 голос
/ 03 сентября 2012

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

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