【问题标题】:Django: identify app in templateDjango:在模板中识别应用程序
【发布时间】:2012-09-17 18:48:10
【问题描述】:

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

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

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

【问题讨论】:

  • 你不能用javascript来做这个吗?
  • 我不想依赖javascript来实现可以在服务器端实现的东西,更简单,更不容易出错。

标签: python django django-templates


【解决方案1】:

最无创的方法是:

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

我将解释第二点,因为 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 用于中间件,但它会在项目的任何地方处理。关于自定义标签:它会做一个工作,可以在没有额外标签的情况下完成。
  • 如果你不想改变每一个视图方法;中间件是要走的路。
  • 可能有一些视图可能无法使用导航栏呈现模板。但中间件仍会处理。
  • 谢谢,成功了。为了澄清起见,我可以在模板中以{{ request.current_app }} 的形式访问变量。
【解决方案2】:

我会尝试“覆盖” {%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%}

【讨论】:

  • 问题是它不是很干。修改菜单需要在所有子模板中进行更改。不过还是谢谢。
  • 您可以使用每个条目一个块将其干燥一点。我认为这是文档中的推荐:docs.djangoproject.com/en/1.4/topics/templates/…,添加了很多 {%blocks%},明确地:“如果您发现自己在多个模板中复制内容,这可能意味着您应该将该内容移动到 {%在父模板中阻止 %}。"
【解决方案3】:

如果你在单独的模板中定义导航菜单,你可以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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多