Django模板 - 我可以设置一个在父模板中使用的变量吗?

时间:2010-02-09 12:18:39

标签: django inheritance templates variables

我有一个包含通用导航菜单的父模板。我希望能够将class="selected"添加到相应的菜单选项中。

我希望能够在子模板中设置变量,例如:

{% set menu = "products" %}

并且做:

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

我不想在View中设置一个值,因为我必须将它添加到我的所有视图方法中,并且我不想在每个子页面中重复整个菜单html,因为如果菜单更改我只想要在一个地方更改HTML。

我是从“非Django”的心态来接近这个吗?

任何帮助都会非常感激。感谢。

5 个答案:

答案 0 :(得分:9)

您在视图中传递的上下文也可在您要扩展的模板中使用。在上下文中添加'menu_class':'selected',您可以设置

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

在基本模板中。

另一种方法是

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

然后可以通过

在您的子模板中扩展
{% block menu_attrib %}selected{% endblock %}

答案 1 :(得分:9)

对于记录, 被视为不良做法......但你可以这样做

{% 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 %}

答案 2 :(得分:1)

当然,这里有不止一个答案!

您可以使用自定义模板标签来绘制菜单并选择合适的模板。

所以你的模板标签是:

{% mymainmenu selecteditem %}

查看django网站上的自定义模板标记文档,但最终会出现类似:

@register.simple_tag
def mymainmenu(selecteditem):

    html = ''

    build the html for the menu here and include selected class

    return html

答案 3 :(得分:0)

谢谢大家 - 最后我按照speakman的建议,将当前菜单选项的名称放在thew上下文中并使用我的:

{%ifequal menu "products" %}
    class="selected"
{% endifequal %}
每个菜单中的

子句opton。

我不认为这是一个很好的解决方案,它将我的“观点”与我的“模板”结合起来比我想要的更多......但也许这只是django quirk

答案 4 :(得分:0)

您可以使用自定义模板标记,如下所述: http://www.soyoucode.com/2011/set-variable-django-template