Есть ли способ сделать блок необязательным в шаблоне Django? - PullRequest
14 голосов
/ 11 августа 2010

В системе шаблонов Django, если у меня есть блок, который я хочу сделать необязательным с помощью оператора if, как мне это сделать?

Я пытался это сделать:

{% if val %}{% block title %}Archive {{ foo }}{% endblock %}{% endif %}

Но это не работает.Есть ли способ сделать это, чтобы для заданного значения (в данном случае Null) блок не выдавался, а базовый шаблон использовал исходные значения?

Редактировать: Позвольте мне быть немного более конкретным, чтобы было легче ответить.

У меня есть страница с 10 записями на страницу.Затем пользователь может перейти на следующую страницу и просмотреть следующие десять пунктов.Для каждой последующей страницы, которая идет дальше первой, я хотел бы, чтобы тег заголовка говорил что-то вроде «Архив 1» или «Архив 10», но если они вернутся на исходную страницу, это больше не архив, и он долженпросто перейдите к оригинальному названию сайта, уже указанному в базовых шаблонах.

Ответы [ 3 ]

21 голосов
/ 12 августа 2010

У меня возникла похожая проблема с проектом, над которым я работаю. Вот как я решил это, используя {{block.super}}, чтобы извлечь значение по умолчанию из родительского блока:

Мой родительский шаблон содержит:

{% block title %}Default Title{% endblock %}

Мой дочерний шаблон содержит:

{% block title %}
    {% if new_title %}{{ new_title }}{% else %}{{ block.super }}{% endif %}
{% endblock %}

* Примечание. Возможно, вы захотите обернуть код в {% spaceless%} {% endpaceless%}, если планируете использовать результат в теге заголовка HTML.

(Похоже, Джордан Рейтер опубликовал то же решение в комментариях к исходному вопросу немного раньше моего ответа.)

9 голосов
/ 11 августа 2010

Насколько я понимаю, block являются заполнителями, которые должны быть "переопределены" в дочерних шаблонах. Они должны быть определены во время компиляции, а не во время выполнения.

Что касается вашей конкретной проблемы, почему бы не изменить заголовок на основе номера страницы (если вы используете нумерацию страниц)? Примерно так:

{% block title %}
    {% ifequal page 1 %}Current{% else %}Archive {{ page }}{% endifequal %}
{% endblock %}
0 голосов
/ 18 декабря 2016

Я бы только добавил к хорошим ответам выше, что в зависимости от версии Django иногда {{ block.super }} помещает контент от мастера дважды , это, кажется, происходит всамые последние версии Django.

Я использую Django 1.8 и всякий раз, когда я ставлю {{ block.super }}, он начинает вести себя таким образом, как дополнение к ответу Джейми, я могу сказать, что в базовом шаблоне выможете поместить контент, который вы хотите

{% block title %} Default Title {% endblock %}

А потом в дочерний элемент, если вы хотите, чтобы нижний колонтитул был унаследован и отображен, просто не делайте ничего, что будет.Но если вы не хотите, чтобы этот блок отображался, поместите тег в дочерний элемент с пустым содержимым, например, так:

{% block title %}

{% endblock %}

Тогда он будет скрыт после его рендеринга, также вы можете перезаписать содержимое наэто если хочешь.

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