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