2010-02-09 130 views
14

我有一个包含通用导航菜单的父模板。我希望能够将class="selected"添加到相应的菜单选项。Django模板 - 我可以设置要在父模板中使用的变量吗?

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

{% set menu = "products" %} 

做:

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

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

我是从一个“非Django”的思维模式接近这个吗?

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

+0

+1,我也想知道这个(或者,想知道它的不错的练习)。类似的效果可能是知道哪个模板被称为 – Agos

+0

jinja2支持这个,但我也在寻找一种方法在django中做到这一点。 – Gattster

回答

1

这里有不止一个答案!

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

所以你的模板标签是:

{% mymainmenu selecteditem %} 

看一看在Django的网站自定义模板标签文档,但它最终会是这样的:

@register.simple_tag 
def mymainmenu(selecteditem): 

    html = '' 

    build the html for the menu here and include selected class 

    return html 
+0

确实有不止一个答案,但这是一个明显的方法。 (虽然起初它可能不明显!) – jcdyer

9

上下文你通过你的视图也可以在你扩展的模板中使用。在上下文中添加'menu_class':'selected',您可以在基本模板中设置

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

另一种方法周围是

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

,然后是可扩展您孩子的模板由

{% block menu_attrib %}selected{% endblock %} 
+0

但是你不能在父模板中重复该块,对吧? – thomaskonrad

0

谢谢大家 - 我到底遵循斯皮克曼的建议,并把当前菜单的名称选项在上下文中并使用我的:

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

子句在每个菜单OPTON。

我不认为这是一个很好的解决方案,它结合我的“意见”我的“模板”比我更会喜欢......但也许这是只需S Django的怪癖

+0

然后点击Speakman答案旁边的复选标记。顺便说一句,Django人似乎有意阻止'{%extends%}'将变量设置为传入的值,如函数。 –

+0

任何想法为什么Django管理员不喜欢这个? – Gattster

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 %} 
+1

哦,你的回答拯救了我的一天。我是django的新手,但在其他框架中使用了这个特性。但是其他答案与我的查询匹配。 –

+0

谢谢,非常好的主意! – mrash

相关问题