python - examples - Django: ¿cómo hacer que una variable esté disponible para todas las plantillas?
django templates examples (2)
Como se ve en this ejemplo, después de Django 1.3 puede simplemente usar render
lugar de render_to_response
que no requiere que pase explícitamente el procesador de contexto.
def another_view_method(request):
categories = Category.objects.all()
return render(
''eg/front_page.html'',
{''is_logged_in'': is_logged_in(request), ''categories'':categories}
)
Me gustaría saber cómo pasar una variable a todas mis plantillas, sin repetir el mismo código en todos los métodos en mi archivo views.py?
En el siguiente ejemplo, me gustaría hacer que las categorías (una matriz de objetos de categoría) estén disponibles para todas las plantillas en la aplicación web.
Eg: I would like to avoid writing ''categories'':categories on every method. Is it possible?
Un método de vista
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))
Otro método de vista
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))
Lo que quiere es un procesador de contexto, y es muy fácil crear uno. Suponiendo que tiene una aplicación llamada custom_app
, siga los siguientes pasos:
- Agregue
custom_app
aINSTALLED_APPS
ensettings.py
(ya lo ha hecho, ¿no?); - Cree un
context_processors.py
en la carpetacustom_app
; Agregue el siguiente código a ese nuevo archivo:
def categories_processor(request): categories = Category.objects.all() return {''categories'': categories}
Agregue
context_processors.py
aTEMPLATE_CONTEXT_PROCESSORS
ensettings.py
TEMPLATE_CONTEXT_PROCESSORS += ("custom_app.context_processors.categories_processor", )
Y ahora puedes usar {{categories}}
en todas las plantillas: D
A partir de Django 1.8
Para agregar un TEMPLATE_CONTEXT_PROCESSORS
, en la configuración debe agregar el siguiente código:
TEMPLATES[0][''OPTIONS''][''context_processors''].append("custom_app.context_processors.categories_processor")
O incluya esa cadena directamente en la clave OPTIONS.context_processors
en su configuración TEMPLATES
.