Django-как сделать переменную доступной для всех шаблонов?
Я хотел бы знать, как передать переменную всем моим шаблонам, не повторяя один и тот же код для каждого метода в моем views.py файл?
В приведенном ниже примере я хотел бы сделать категории (массив объектов категорий) доступными для всех шаблонов в веб-приложении.
Eg: I would like to avoid writing 'categories':categories on every method. Is it possible?
один метод
def front_page(request):
categories = Category.objects.all()
if is_logged_in(request) is False:
return render_to_response('users/signup.html', {'is_logged_in': is_logged_in(request), 'categories':categories}, context_instance=RequestContext(request))
else:
return render_to_response('users/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request))
другой метод просмотра
def another_view_method(request):
categories = Category.objects.all()
return render_to_response('eg/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request))
2 ответов
то, что вы хотите, это контекстный процессор, и его очень легко создать. Предполагая, что у вас есть приложение с именем custom_app
выполните следующие шаги:
- добавить
custom_app
toINSTALLED_APPS
наsettings.py
(вы уже сделали это, не так ли?); - создать
context_processors.py
на ; -
добавьте следующий код в этот новый файл:
def categories_processor(request): categories = Category.objects.all() return {'categories': categories}
-
добавить
context_processors.py
toTEMPLATE_CONTEXT_PROCESSORS
insettings.py
TEMPLATE_CONTEXT_PROCESSORS += ("custom_app.context_processors.categories_processor", )
и теперь вы можете использовать {{categories}}
во всех шаблонах: D
по состоянию на Django 1.8
добавить TEMPLATE_CONTEXT_PROCESSORS
в настройках необходимо добавить следующий код:
TEMPLATES[0]['OPTIONS']['context_processors'].append("custom_app.context_processors.categories_processor")
или включить эту строку непосредственно в OPTIONS.context_processors
ключ в TEMPLATES
настройка.
как видно этой пример, сообщение Django 1.3 вы можете просто использовать render
вместо render_to_response
который не требует, чтобы вы явно передавали обработчик контекста.
def another_view_method(request):
categories = Category.objects.all()
return render(
'eg/front_page.html',
{'is_logged_in': is_logged_in(request), 'categories':categories}
)