我的 Django 项目中有三个应用程序对应于网站的不同部分。所有这三个部分都可以从导航菜单访问,在 common base.html 模板中定义。
我希望能够识别调用模板以将“活动”css 类添加到与网站活动部分相对应的菜单选项的应用程序。
除了修改每个视图以将附加变量传递给模板之外,最好的方法是什么?
我的 Django 项目中有三个应用程序对应于网站的不同部分。所有这三个部分都可以从导航菜单访问,在 common base.html 模板中定义。
我希望能够识别调用模板以将“活动”css 类添加到与网站活动部分相对应的菜单选项的应用程序。
除了修改每个视图以将附加变量传递给模板之外,最好的方法是什么?
最非侵入性的方法是:
我将解释第二点,因为django 文档中详细介绍了编写自定义模板标签。
更新上下文;我们需要一些中间件。这应该做你需要的:
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。
我会尝试“覆盖” {%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%}
如果您在单独的模板中定义导航菜单,则可以将其包含在附加上下文中。
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 %}
导航.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>