Cómo Crear Context Processors en Django

En Django, el contexto es un conjunto de variables que se pasan a las plantillas desde las vistas. Normalmente, cada vista envía un conjunto de variables específico, pero en algunos casos, necesitamos variables globales que estén disponibles en todas las plantillas de la aplicación. Para este propósito, se utilizan los Context Processors.

¿Qué Son los Context Processors?

Un Context Processor es una función que recibe como argumento el objeto request y retorna un diccionario de elementos que estarán disponibles en todos los templates de tu proyecto. Es una forma sencilla de compartir información global (como el usuario logueado o el año actual) sin tener que agregar manualmente esas variables en cada vista.

En realidad, un Context Processor en Django es muy similar a los Procesadores de Contexto en Flask, ya que ambos permiten agregar variables al contexto de las plantillas de manera global.

Crear y Configurar un Context Processor en Django

Para crear un context processor básico, definimos una función que retorna un diccionario con las variables que deseamos hacer globales: Una vez creado el context processor, se debe agregar en la configuración de TEMPLATES para que Django lo cargue globalmente.

Ejemplos de Context Processors Comunes


1Mostrar el Año Actual

Un uso común de los context processors es devolver información como el año actual, que podría ser útil para el pie de página en todas las plantillas. Veamos cómo hacerlo:

python
# context_processors.py
import datetime

def get_current_year(request):
  current_year = datetime.datetime.now().year
  return {
      "current_year": current_year,
  }

Para activar este context processor, debes agregarlo en la configuración de TEMPLATES en el archivo settings.py:

python
# settings.py
TEMPLATES = [
  {
      # ... otras configuraciones
      "OPTIONS": {
          "context_processors": [
              "django.template.context_processors.debug",
              "django.template.context_processors.request",
              "django.contrib.auth.context_processors.auth",
              "django.contrib.messages.context_processors.messages",
              "myapp.context_processors.get_current_year",  # Agregado aquí el context processor
          ],
      },
  },
]

Con esto, podrás usar la variable current_year en cualquier plantilla de tu proyecto:

html
<p>&copy; {{ current_year }}</p>

2Mostrar el Usuario Logueado

El procesador de contexto por defecto django.contrib.auth.context_processors.auth ya proporciona una variable user, que te permite acceder al usuario que está actualmente logueado en tu aplicación:

html
<h1>Bienvenido, {{ user.username }}</h1>

Este context processor se encuentra en la configuración predeterminada de Django, por lo que no necesitas agregarlo manualmente si ya estás utilizando la configuración estándar.

3Mostrar el Número de Notificaciones

En muchos sitios web, es común mostrar un número de notificaciones o alertas para el usuario. Supongamos que tienes un sistema de notificaciones, y quieres que esta información esté disponible en todas las plantillas:

python
# context_processors.py
from .models import Notification

def get_notification_count(request):
  if request.user.is_authenticated:
      count = Notification.objects.filter(user=request.user, is_read=False).count()
      return {
          "notification_count": count,
      }
  return {
      "notification_count": 0,
  }

Este context processor devuelve el número de notificaciones no leídas para el usuario logueado. Nuevamente, lo agregas a TEMPLATES:

python
# settings.py
TEMPLATES = [
  {
      "OPTIONS": {
          "context_processors": [
              # ... otros context processors
              "myapp.context_processors.get_notification_count",  # Agregado aquí el context processor
          ],
      },
  },
]

Y ahora podrás acceder a esta variable en tus plantillas:

html
<p>Tienes {{ notification_count }} notificaciones nuevas.</p>

4Mostrar Configuraciones Globales del Proyecto

A veces, puede ser útil tener configuraciones globales, como una URL base o alguna variable de entorno. Para ello, creamos un context processor que las devuelva:

python
# context_processors.py
import os

def get_global_config(request):
  return {
      "site_name": "Mi Proyecto Django",
      "base_url": os.getenv("BASE_URL", "https://www.miweb.com"),
  }

Este context processor podría servir para mostrar el nombre del sitio o enlaces que deben ser utilizados globalmente. Se agrega a settings.py de la misma manera que los anteriores:

python
# settings.py
TEMPLATES = [
  {
      "OPTIONS": {
          "context_processors": [
              # ... otros context processors
              "myapp.context_processors.get_global_config",  # Agregado aquí el context processor
          ],
      },
  },
]

En las plantillas:

html
<h1>{{ site_name }}</h1>
<p>Visítanos en {{ base_url }}</p>
  Conclusión

Crear context processors personalizados en Django es una excelente manera de gestionar variables globales de forma eficiente. A través de ejemplos simples, hemos cubierto cómo mostrar el año actual, las notificaciones, el usuario logueado y configuraciones globales, todo disponible en cualquier plantilla de tu proyecto.