How to get the name of current app within a template?

本秂侑毒 提交于 2021-01-20 17:51:49

问题


What's the simplest way to access the name of the current app within template code?

Alternatively, what's the simplest way to define a template variable to hold the name of the current app?

(The goal here is to minimize the number of places I need to edit if I rename an app.)


回答1:


There's a way to obtain an app name for a current request.
First, in your project's urls.py, considering your app is called 'main':

#urls.py
url(r'^', include('main.urls', app_name="main")),

Then, a context processsor:

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

Don't forget to enable it in your settings:

#settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.request",
"main.contexts.appname",)

You can use it in your template like any other variable: {{ appname }}.




回答2:


Since Django 1.5 there is a "resolver_match" attribute on the request object.

https://docs.djangoproject.com/en/dev/ref/request-response/

This contains the matched url configuration including "app_name", "namespace", etc.

https://docs.djangoproject.com/en/2.2/ref/urlresolvers/#django.urls.ResolverMatch

The only caveat is that it is not populated until after the first middleware passthrough, so is not available in process_request functions of middleware. However it is available in middleware process_view, views, and context processors. Also, seems like resolver_match is not populated in error handlers.

Example context processor to make available in all templates:

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
    }


来源:https://stackoverflow.com/questions/20020911/how-to-get-the-name-of-current-app-within-a-template

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!