У меня есть родительский шаблон, который содержит универсальное навигационное меню. Я хочу быть в состоянии добавить class="selected"
к соответствующему пункту меню.
Я хочу быть в состоянии установить переменную в дочернем шаблоне, например:
{% set menu = "products" %}
и сделайте:
{%ifequal menu "products" %}class="selected"{% endifequal %}
Я не хочу устанавливать значение в Представлении, потому что я должен был бы добавить это ко всем своим методам просмотра, и я не хочу повторять весь HTML меню на каждой дочерней странице, потому что, если меню изменяется, я только хочу изменить HTML в одном месте.
Я приближаюсь к этому от мышления “non-Django”?
Любая справка действительно ценилась бы. спасибо.
Контекст, который вы передаете в представлении, также доступен в шаблонах, которые вы расширяете. Добавив в контекст 'menu_class': 'selected', вы могли бы установить
<div id="menu" class="{{ menu_class }}">
в базовом шаблоне.
Другим способом может быть
<div id="menu" class="mymenu {% block menu_attrib %}{% endblock %}">
который затем расширяется в дочернем шаблоне на
{% block menu_attrib %}selected{% endblock %}
для записи, это считается плохой практикой ... но вы можете сделать это
{% with "products" as menu %}
{{ menu }}
{% endwith %}
Поскольку это на самом деле не решает вашу конкретную проблему, вот возможное приложение ...
<div class='menu'>
{% block menuitems %}
<a class='{% ifequal menu 'products' %}selected{% endifequal %}' href='/whereever/'>products</a>
...
{% endblock %}
</div>
и в дочернем шаблоне
{% block menuitems %}
{% with 'products' as menu %}
{{ block.super }}
{% endwith %}
{% endblock %}
Здесь, конечно, есть не один ответ!
Вы можете использовать пользовательские теги шаблонов как для рисования меню, так и для выбора подходящего.
Итак, ваш тег шаблона будет:
{% mymainmenu selecteditem %}
Взгляните на документацию по пользовательским тегам шаблонов на сайте django, но это закончится чем-то вроде:
@register.simple_tag
def mymainmenu(selecteditem):
html = ''
build the html for the menu here and include selected class
return html
Спасибо всем - в конце концов, я последовал предложению Speakman и поместил имя текущего параметра меню в контекст w и использовал предложение my:
{%ifequal menu "products" %}
class="selected"
{% endifequal %}
в каждом выбор меню.
Я не думаю, что это отличное решение, оно связывает мои "представления" с моими "шаблонами" больше, чем мне бы хотелось ... но, возможно, это просто причуда django