在模板代码中访问当前应用名称的最简单方法是什么?
或者,定义模板变量以保存当前应用程序名称的最简单方法是什么?
(这里的目标是在重命名应用时尽量减少需要编辑的地方数量。)
答案 0 :(得分:20)
由于Django 1.5在请求对象上有一个“resolver_match”属性。
https://docs.djangoproject.com/en/dev/ref/request-response/
这包含匹配的url配置,包括“app_name”,“namespace”等。
https://docs.djangoproject.com/en/1.6/ref/urlresolvers/#django.core.urlresolvers.ResolverMatch
唯一需要注意的是,直到第一个中间件直通之后才会填充它,因此在中间件的process_request函数中不可用。但是,它可用于中间件process_view,视图和上下文处理器。此外,似乎resolver_match未在错误处理程序中填充。
要在所有模板中使用的示例上下文处理器:
def resolver_context_processor(request):
return {
'app_name': request.resolver_match.app_name,
'namespace': request.resolver_match.namespace,
'url_name': request.resolver_match.url_name
}
答案 1 :(得分:18)
有一种方法可以获取当前请求的应用名称
首先,在您的项目的urls.py中,考虑您的应用名为'main'
:
#urls.py
url(r'^', include('main.urls', app_name="main")),
然后,上下文处理:
#main/contexts.py
from django.core.urlresolvers import resolve
def appname(request):
return {'appname': resolve(request.path).app_name}
不要忘记在您的设置中启用它:
#settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.request",
"main.contexts.appname",)
您可以像使用其他变量一样在模板中使用它:{{ appname }}
。