我的Django项目中有三个应用程序,它们对应于网站的各个部分。所有这三个部分都可以从导航菜单访问,在常见的base.html模板中定义。
我希望能够识别调用该模板的应用程序,以将“活动”css类添加到与该站点的活动部分对应的菜单选项中。
除了修改每个视图以将其他变量传递给模板之外,最好的方法是什么?
答案 0 :(得分:2)
最无创的方式是:
我将解释第二位,因为在django文档中详细介绍了编写custom template tags。
更新背景;我们需要一些中间件。 应该做你需要的事情:
class SetApplicationName(object):
def process_view(self, request, view_func, view_args, view_kwargs):
request.current_app = view_func.__module__.split('.')[0]
将此放置在django可以找到的位置(在PYTHONPATH
中的任何目录中),并将其添加到您的中间件类中。另外,请确保模板上下文处理器中有django.core.context_processors.request
。
在您的模板中,现在您有{{ request.current_app }}
指向应用名称。
您的模板标记应该类似于{% navigation_menu request.current_app %}
,然后您可以相应地修改菜单css。
答案 1 :(得分:0)
我会尝试“覆盖”{%block%}标记。
在您的base.html模板中输入如下内容:
{%block navigation_bar%}
<div class="regular">First app</div>
<div class="regular">Second app</div>
<div class="regular">Third app</div>
{%endblock%}
在后代模板中,将navitation_bar块更改为其他模板。 first_app_base.html如下所示:
{%extends "base.html"%}
{%block navigation_bar%}
<div class="active">First app</div>
<div class="regular">Second app</div>
<div class="regular">Third app</div>
{%endblock%}
答案 2 :(得分:0)
如果您在单独的模板中定义导航菜单,则可以include使用其他上下文。
<强> base.html文件:强>
{% block navigation %}Here will be navigation{% endblock %}
<强> template_from_some_app.html:强>
{% extends "base.html" %}
{% block navigation %}
{% include "navigation.html" with active_app='second_app' %}
{% endblock %}
<强> navigation.html:强>
<ul class="nav">
<li {% if active_app == 'first_app' %} class="active">{% endif %}>
First app
</li>
<li {% if active_app == 'second_app' %} class="active">{% endif %}>
Second app
</li>
<li {% if active_app == 'third_app' %} class="active">{% endif %}>
Third app
</li>
</ul>