0

我的 Django 项目中有三个应用程序对应于网站的不同部分。所有这三个部分都可以从导航菜单访问,在 common base.html 模板中定义。

我希望能够识别调用模板以将“活动”css 类添加到与网站活动部分相对应的菜单选项的应用程序。

除了修改每个视图以将附加变量传递给模板之外,最好的方法是什么?

4

3 回答 3

2

最非侵入性的方法是:

  1. 编写一个模板标签来生成你的菜单。
  2. 使用应用程序名称更新您的上下文。
  3. 将此传递给模板标签并相应地修改 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。

于 2012-09-26T08:10:57.927 回答
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%}
于 2012-09-26T07:41:23.737 回答
0

如果您在单独的模板中定义导航菜单,则可以其包含在附加上下文中。

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>
于 2012-09-26T08:00:56.660 回答