Как получить имя текущего приложения в шаблоне?

Какой самый простой способ получить доступ к имени текущего приложения в шаблоне?

В качестве альтернативы, какой самый простой способ определить переменную шаблона для хранения имени текущего приложения?

(Цель состоит в том, чтобы свести к минимуму количество мест, которые мне нужно отредактировать, если я переименую приложение.)

Ответ 1

Есть способ получить имя приложения для текущего запроса.
Во-первых, в вашем проекте 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 }}.

Ответ 2

Так как Django 1.5 имеет атрибут resolver_match в объекте запроса.

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

Это содержит согласованную конфигурацию URL, включающую "имя_пользователя", "пространство имен" и т.д.

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
    }