Как получить имя текущего приложения в шаблоне?
Какой самый простой способ получить доступ к имени текущего приложения в шаблоне?
В качестве альтернативы, какой самый простой способ определить переменную шаблона для хранения имени текущего приложения?
(Цель состоит в том, чтобы свести к минимуму количество мест, которые мне нужно отредактировать, если я переименую приложение.)
Ответы
Ответ 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
}