【问题标题】:Django templates - can I set a variable to be used in a parent template?Django 模板 - 我可以设置要在父模板中使用的变量吗?
【发布时间】:2011-01-14 19:03:08
【问题描述】:

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

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

{% set menu = "products" %}

然后做:

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

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

我是从“非 Django”的心态来处理这个问题的吗?

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • +1,我也想知道这一点(或者,想知道这是否不是坏习惯)。类似的效果可能是知道调用了哪个模板
  • jinja2 支持这一点,但我也在寻找一种在 django 中执行此操作的方法。

标签: django inheritance templates variables


【解决方案1】:

郑重声明,它认为是一种不好的做法......但你可以这样做

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

【讨论】:

  • 天哪,你的回答拯救了我的一天。我是 django 新手,但在其他框架中使用过此功能。但没有其他答案与我的查询匹配。
【解决方案2】:

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

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

在基本模板中。

另一种方法是

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

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

{% block menu_attrib %}selected{% endblock %}

【讨论】:

  • 但是你不能在父模板中重复那个块,对吧?
【解决方案3】:

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

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

所以你的模板标签是:

{% mymainmenu selecteditem %}

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

@register.simple_tag
def mymainmenu(selecteditem):

    html = ''

    build the html for the menu here and include selected class

    return html

【讨论】:

  • 确实有不止一个答案,但这是一种显而易见的方法。 (虽然一开始可能并不明显!)
【解决方案4】:

您可以使用此处所述的自定义模板标签: http://www.soyoucode.com/2011/set-variable-django-template

【讨论】:

    【解决方案5】:

    谢谢大家——最后我听从了演讲者的建议,将当前菜单选项的名称放在了上下文中,并使用了 my:

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

    每个菜单选项中的子句。

    我不认为这是一个很好的解决方案,它将我的“视图”与我的“模板”结合得比我想要的要多……但也许这只是 django 的怪癖

    【讨论】:

    • 然后点击 Speakman 答案旁边的复选标记。顺便说一句,Django 的人似乎故意阻止 {% extends %} 将变量设置为像函数一样的传入值。
    • 知道为什么 django 管理员不喜欢这个吗?
    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多