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"的心态来接近这个吗?
任何帮助将非常感激.谢谢.
您在视图中传递的上下文也可在您要扩展的模板中使用.在上下文中添加'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)
记录,这被认为是一种不好的做法...但你可以做到这一点
{% 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)
当然,这里有不止一个答案!
您可以使用自定义模板标签来绘制菜单并选择适当的菜单。
所以你的模板标签将是:
{% 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)