Tengo un archivo base.html donde en la barra lateral recorre todos los espacios dentro de mi modelo de Espacios y los muestra como enlaces. Me pregunto, en lugar de pasar estos espacios a través de cada vista, ¿hay alguna manera de tenerlos en la plantilla base? Intenté buscarlo y encontré etiquetas de plantilla, pero no creo que sean lo que estoy buscando.
Base.html
<div class="sidenav"> <h2>Spaces:</h2> {% for space in spaces %} <a href="/{{space}}">{{space}}</a> {% endfor %} </div>En este momento estoy pasando 'espacios' a través de mis vistas, pero no quiero tener que hacer eso en cada vista que creo.
¡Cualquier ayuda sería apreciada!
Para tener alguna variable global para todas las plantillas, Django proporciona un context processor . Un procesador de contexto es una función de Python que toma el objeto de la solicitud como argumento y devuelve un diccionario que se agrega al contexto de la solicitud.
Puede agregar los objetos de spaces en el procesador de contexto de esta manera:
nombre_aplicación/procesadores_contexto.py
from .app_name import Space def spaces(request): # It must return a dictionary don't forget return {'spaces': Space.objects.all()} En su procesador de contexto, crea una instancia del espacio utilizando el objeto de solicitud y lo pone a disposición de las plantillas como una variable denominada spaces .
configuración.py
Y luego, debe agregar este procesador de contexto personalizado en la variable TEMPLATES en settings.py de esta manera:
TEMPLATES = [ { # ... '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', # Customs 'app_name.context_processors.space', ], }, ] template.html Ahora tiene acceso a spaces variables en todas las plantillas del proyecto.
<div class="sidenav"> <h2>Spaces:</h2> <!-- spaces variable is in all templates --> {% for space in spaces %} <a href="/{{space}}">{{space}}</a> {% endfor %} </div>