Шаблоны Django - я могу установить переменную, которая будет использоваться в родительском шаблоне?

У меня есть родительский шаблон, который содержит универсальное навигационное меню. Я хочу быть в состоянии добавить class="selected" к соответствующему пункту меню.

Я хочу быть в состоянии установить переменную в дочернем шаблоне, например:

{% set menu = "products" %}

и сделайте:

{%ifequal menu "products" %}class="selected"{% endifequal %}

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

Я приближаюсь к этому от мышления “non-Django”?

Любая справка действительно ценилась бы. спасибо.

15
задан Paul D. Waite 9 February 2010 в 16:07
поделиться

4 ответа

Контекст, который вы передаете в представлении, также доступен в шаблонах, которые вы расширяете. Добавив в контекст 'menu_class': 'selected', вы могли бы установить

<div id="menu" class="{{ menu_class }}">

в базовом шаблоне.

Другим способом может быть

<div id="menu" class="mymenu {% block menu_attrib %}{% endblock %}">

который затем расширяется в дочернем шаблоне на

{% block menu_attrib %}selected{% endblock %}
9
ответ дан 1 December 2019 в 03:52
поделиться

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

{% 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 %}
9
ответ дан 1 December 2019 в 03:52
поделиться

Здесь, конечно, есть не один ответ!

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

Итак, ваш тег шаблона будет:

{% mymainmenu selecteditem %}

Взгляните на документацию по пользовательским тегам шаблонов на сайте django, но это закончится чем-то вроде:

@register.simple_tag
def mymainmenu(selecteditem):

    html = ''

    build the html for the menu here and include selected class

    return html
1
ответ дан 1 December 2019 в 03:52
поделиться

Спасибо всем - в конце концов, я последовал предложению Speakman и поместил имя текущего параметра меню в контекст w и использовал предложение my:

{%ifequal menu "products" %}
    class="selected"
{% endifequal %}

в каждом выбор меню.

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

0
ответ дан 1 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: