template examples python django django-nonrel

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 a INSTALLED_APPS en settings.py (ya lo ha hecho, ¿no?);
  • Cree un context_processors.py en la carpeta custom_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 a TEMPLATE_CONTEXT_PROCESSORS en settings.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 .