2010-08-11 2 views
8

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

Я пытался это:

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

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

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

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

+0

Я не знаю ответа на ваш вопрос, но знаете ли вы о фильтре 'default' - это делает то, что вы хотите? http://docs.djangoproject.com/en/dev/ref/templates/builtins/#default –

+0

Спасибо Доминик, я ищу что-то подобное, но я не ищу способ назначить по умолчанию, я Я пытаюсь выяснить, могу ли я поставить инструкцию if вокруг блоков? – Vernon

ответ

8

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

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

{% block title %} 
    {% ifequal page 1 %}Current{% else %}Archive {{ page }}{% endifequal %} 
{% endblock %} 
15

Я столкнулся с аналогичной проблемой с проектом, над которым я работаю. Вот как я решил его с помощью {{}} block.super тянуть значение по умолчанию из родительского блока:

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

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

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

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

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

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

+0

Спасибо, я знал с самого начала, что могу просто поставить if-заявления внутри блока, я просто задавался вопросом, я думаю, если бы я сделал блок необязательным - я думаю, нет. – Vernon

+0

Блестящий! Это позволяет мне включать/выключать блоки на основе значения формы (поэтому я могу иметь версию для печати). – sage

+1

'{{block.super}}' сделал трюк. – AliBZ

0

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

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

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

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

{% block title %} 

{% endblock %} 

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

Смежные вопросы