Django:在模板中识别应用程序

时间:2012-09-26 07:31:53

标签: python django django-templates

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

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

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

3 个答案:

答案 0 :(得分:2)

最无创的方式是:

  1. 编写一个生成菜单的模板标记。
  2. 使用应用程序名称更新您的上下文。
  3. 将此传递给模板标记并相应地修改css。
  4. 我将解释第二位,因为在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>