如何获取模板中当前应用的名称?

kjo*_*kjo 14 django django-templates

在模板代码中访问当前应用程序名称的最简单方法是什么?

或者,定义模板变量以保存当前应用程序名称的最简单方法是什么?

(这里的目标是在重命名应用程序时最小化我需要编辑的位置数.)

Ken*_*ton 21

从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

唯一需要注意的是,直到第一个中间件passthrough 之后才会填充它,因此在中间件的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
    }
Run Code Online (Sandbox Code Playgroud)

  • 这对我很有用:`{{request.resolver_match.app_name}}`.您只需要启用请求上下文处理器. (5认同)

Ale*_*ich 18

有一种方法可以获取当前请求的应用程序名称.
首先,在您的项目的urls.py中,考虑您的应用程序被调用'main':

#urls.py
url(r'^', include('main.urls', app_name="main")),
Run Code Online (Sandbox Code Playgroud)

然后,一个上下文处理器:

#main/contexts.py
from django.core.urlresolvers import resolve
def appname(request):
    return {'appname': resolve(request.path).app_name}
Run Code Online (Sandbox Code Playgroud)

不要忘记在您的设置中启用它:

#settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.request",
"main.contexts.appname",)
Run Code Online (Sandbox Code Playgroud)

您可以像在任何其他变量中一样在模板中使用它:{{ appname }}.

  • 谢谢!虽然它只有5行代码,但它的代码大约是我预期的5倍.我想我很惊讶Django并不认为这个信息有用,足以让它在默认情况下以某种方式随时可用... (5认同)
  • 这对Django 2.0.3仍然有效吗? (2认同)