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

Tom*_*ell 15 django variables inheritance templates

我有一个包含通用导航菜单的父模板.我希望能够添加class="selected"到适当的菜单选项.

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

{% set menu = "products" %}
Run Code Online (Sandbox Code Playgroud)

并做:

{%ifequal menu "products" %}class="selected"{% endifequal %}
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助将非常感激.谢谢.

spe*_*man 9

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

<div id="menu" class="{{ menu_class }}">
Run Code Online (Sandbox Code Playgroud)

在基本模板中.

另一种方式是

<div id="menu" class="mymenu {% block menu_attrib %}{% endblock %}">
Run Code Online (Sandbox Code Playgroud)

然后可以在您的子模板中扩展

{% block menu_attrib %}selected{% endblock %}
Run Code Online (Sandbox Code Playgroud)


Jia*_*aro 9

记录,这认为是一种不好的做法...但你可以做到这一点

{% with "products" as menu %}
    {{ menu }}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)

由于这实际上没有解决您的具体问题,因此这是一个可能的应用......

<div class='menu'>
    {% block menuitems %}
        <a class='{% ifequal menu 'products' %}selected{% endifequal %}' href='/whereever/'>products</a>
        ...
    {% endblock %}
</div>
Run Code Online (Sandbox Code Playgroud)

并在儿童模板中

{% block menuitems %}
    {% with 'products' as menu %}
        {{ block.super }}
    {% endwith %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)


Pho*_*beB 1

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

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

所以你的模板标签将是:

{% mymainmenu selecteditem %}
Run Code Online (Sandbox Code Playgroud)

查看 django 网站上的自定义模板标签文档,但最终会是这样的:

@register.simple_tag
def mymainmenu(selecteditem):

    html = ''

    build the html for the menu here and include selected class

    return html
Run Code Online (Sandbox Code Playgroud)