Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:在模板中标识应用程序_Python_Django_Django Templates - Fatal编程技术网

Python Django:在模板中标识应用程序

Python Django:在模板中标识应用程序,python,django,django-templates,Python,Django,Django Templates,我的Django项目中有三个应用程序,分别对应于网站的各个部分。这三个部分都可以从common base.html模板中定义的导航菜单访问 我希望能够识别调用模板的应用程序,以便将“活动”css类添加到对应于站点活动部分的菜单选项中 除了修改每个视图向模板传递一个附加变量之外,最好的方法是什么?我会尝试“覆盖”{%block%}标记 在base.html模板中,放置如下内容: {%block navigation_bar%} <div class="regular">First a

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

我希望能够识别调用模板的应用程序,以便将“活动”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%}
{%block导航\u bar%}
第一个应用程序
第二个应用程序
第三个应用程序
{%endblock%}
在子体模板中,使用其他工具更改导航栏块。第一个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%}
{%extends“base.html”%}
{%block导航_bar%}
第一个应用程序
第二个应用程序
第三个应用程序
{%endblock%}

如果在单独的模板中定义导航菜单,则可以使用其他上下文来定义它

base.html:

{% block navigation %}Here will be navigation{% endblock %}
{% extends "base.html" %}

{% block navigation %}
    {% include "navigation.html" with active_app='second_app' %}
{% endblock %}
<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>
模板来自一些应用程序。html:

{% block navigation %}Here will be navigation{% endblock %}
{% extends "base.html" %}

{% block navigation %}
    {% include "navigation.html" with active_app='second_app' %}
{% endblock %}
<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>
navigation.html:

{% block navigation %}Here will be navigation{% endblock %}
{% extends "base.html" %}

{% block navigation %}
    {% include "navigation.html" with active_app='second_app' %}
{% endblock %}
<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>
    {%endif%}> 第一个应用程序 {%endif%}> 第二个应用程序 {%endif%}> 第三个应用程序

最无创的方法是:

  • 编写生成菜单的模板标记
  • 使用应用程序名称更新您的上下文
  • 将其传递给模板标记并相应地修改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\u processors.request

    在模板中,现在有了
    {{request.current_app}}
    ,它应该指向应用程序名称


    你的模板标签应该类似于
    {%navigation\u menu request.current\u app%}
    ,然后你可以相应地修改你的菜单css。

    你不能用javascript来做这件事吗?我不想依靠javascript来实现服务器端可以实现的东西,更简单,更不容易出错。事情是它不是很枯燥。修改菜单需要在所有子模板中更改它。不过还是谢谢。你可以用一个方块把它弄干一点。我认为这是文档中的建议:,添加了大量{%block%},明确地说:“如果您发现自己在许多模板中复制内容,这可能意味着您应该将该内容移动到父模板中的{%block%}”。+1表示中间件,但它将在项目中的任何地方处理。关于自定义标记:它将完成一项工作,无需附加标记即可完成;中间件是一个不错的选择。可能有一些视图无法使用导航栏呈现模板。但中间件仍将进行处理。谢谢,成功了。为了澄清起见,我可以访问模板中的变量
    {{{request.current_app}}