Джанго условное наследование шаблонов - PullRequest
2 голосов
/ 04 апреля 2010

У меня есть шаблон, который отображает элементы объекта с гиперссылками на другие части моего сайта. У меня есть другая функция, которая отображает прошлые версии одного и того же объекта. На этом экране я не хочу гиперссылок.

Я предполагаю, что не могу динамически отключать гиперссылки, поэтому я включил обе версии в один и тот же шаблон. Я использую оператор if, чтобы отобразить версию с гиперссылкой или текстовую версию. Я предпочитаю хранить их в одном шаблоне, потому что если мне нужно изменить формат одного из них, его будет легко применить к другому прямо там.

Шаблон расширяет framework.html. Framework имеет систему хлебных крошек и расширяет base.html. База имеет простую систему верхнего меню.

Итак, вот моя дилемма. При просмотре стандартных данных гиперссылки я хочу видеть главное меню и панировочные сухари. Но при просмотре текстовых данных в предыдущей версии мне нужны только данные, ни меню, ни хлебные крошки. Я не уверен, возможно ли это, учитывая мой текущий дизайн. Я попытался, чтобы Framework наследовал основной шаблон, чтобы я мог выбрать либо Framework (и отображать хлебные крошки), либо сам шаблон, пропуская хлебные крошки, но я хочу, чтобы framework.html был доступен и для других шаблонов. Если framework.html расширяет определенный шаблон, я теряю возможность отображать его в других шаблонах.

Я попытался написать оператор if, который бы отображал блок top_menu и блок nav_menu из base.html и framework.html соответственно. Это перезапишет их блоки и позволит мне отключить эти элементы по условию if. К сожалению, это не кажется условным; если элементы блока вообще присутствуют в шаблоне, окружены ли они или нет, я теряю меню.

Я думал об использовании {% include%} для сбора панировочных сухарей и разделенного верхнего меню. В этом случае, однако, я должен буду включать это все время. Нет больше наследства. Это лучший вариант с учетом моих требований?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2010

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

Допустим, у вас есть framework.html, например:

{% extends "base.html" %}

<html>...<body>...
{% block hyperlinks %}
your hyperlinks here
{% endblock %}
rest of the code
</body></html>

Затем вы можетесоздайте шаблон типа nolinks.html и используйте его

{% extends "framework.html" %}
{# here you'll have everything from framework
but now we disable the breadcrumbs #}
{% block hyperlinks %}{% endblock %}

Если вы получаете прошлые данные, вы можете использовать nolinks для рендеринга вместо framework .

Надеюсь, это поможет.

1 голос
/ 15 мая 2014

Отсюда: Есть ли способ сделать {% extends '...'%} условным? - Джанго

Это можно сделать так:

{% extends ajax|yesno:"ajax_base.html,main_base.html" %}

Или:

{% extends a_variable_containing_base_template_name %}

Что лучше всего подходит для вас.

С уважением,

...