我有一个包含通用导航菜单的父模板。我希望能够将class="selected"
添加到相应的菜单选项中。
我希望能够在子模板中设置变量,例如:
{% set menu = "products" %}
并且做:
{%ifequal menu "products" %}class="selected"{% endifequal %}
我不想在View中设置一个值,因为我必须将它添加到我的所有视图方法中,并且我不想在每个子页面中重复整个菜单html,因为如果菜单更改我只想要在一个地方更改HTML。
我是从“非Django”的心态来接近这个吗?
任何帮助都会非常感激。感谢。
答案 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