Шаблоны Django - можно ли установить переменную для использования в родительском шаблоне? - PullRequest
15 голосов
/ 09 февраля 2010

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

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

{% set menu = "products" %}

и делай:

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

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

Я подхожу к этому из «не-Джанго» мышления?

Любая помощь будет очень признательна. спасибо.

Ответы [ 5 ]

9 голосов
/ 09 февраля 2010

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

{% 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 голосов
/ 09 февраля 2010

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

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

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

Другой путь был бы

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

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

{% block menu_attrib %}selected{% endblock %}
1 голос
/ 09 февраля 2010

Здесь, конечно, есть более одного ответа!

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

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

{% mymainmenu selecteditem %}

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

@register.simple_tag
def mymainmenu(selecteditem):

    html = ''

    build the html for the menu here and include selected class

    return html
0 голосов
/ 18 февраля 2011

Вы можете использовать пользовательский тег шаблона, как описано здесь: http://www.soyoucode.com/2011/set-variable-django-template

0 голосов
/ 09 февраля 2010

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

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

пункт в каждом меню opton.

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

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