template - Django: ¿accediendo a las variables de sesión desde dentro de una plantilla?
django templates free (9)
Si configuro una variable de sesión en Django, como:
request.session["name"] = "name"
¿Hay alguna manera de acceder a ella desde una plantilla, o tengo que recuperarla desde una vista y luego pasarla a una plantilla?
Preguntar porque tengo alrededor de 10 pequeñas variables de sesión a las que me gustaría acceder dentro de una plantilla, y pasar las 10 de la vista a la plantilla podría ser un poco complicado.
(Tengo que usar variables de sesión porque es un HttpResponseRedirect, pero almacenar las variables en una base de datos es excesivo para mis propósitos).
Entonces, ¿hay alguna forma de tomar variables de sesión directamente dentro de una plantilla?
Continuando @Ludwik Trammer answer, Cómo agregar TEMPLATE_CONTEXT_PROCESSORS
Para django 1.6, en settings.py agregue TEMPLATE_CONTEXT_PROCESSORS refiriendo el siguiente código y luego use {{ request.session.name }}
en los archivos de plantilla.
TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"django.core.context_processors.request")
Referencia https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS
Por favor tenga en cuenta que, debe usar ese código completo en la configuración. Si utiliza solo "django.core.context_processors.request"
la configuración predeterminada.
En tu settins.py
TEMPLATE_CONTEXT_PROCESSORS = (
''django.core.context_processors.request'',
)
Tu opinión, tal vez se vea así.
from django.shortcuts import render_to_response, render
from django.http import HttpResponse, HttpResponseRedirect
from django.template import RequestContext
@login_required()
def index_admin(request):
return render_to_response(''carteras/index_admin.html'', {}, context_instance=RequestContext(request))
Estoy usando Django 1.9 (marzo de 2016) y para que {{ request.session.name}}
funcione, mi configuración tiene esto ::
TEMPLATES = [
{
''BACKEND'': ''django.template.backends.django.DjangoTemplates'',
''DIRS'': [],
''APP_DIRS'': True,
''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'',
],
},
},
]
La diferencia con las respuestas anteriores es: ''django.core.context_processors.request''
convirtió en ''django.template.context_processors.request''
Primera impresión request.session.keys()
luego
request.session[''_auth_user_id'']
request.session[''_auth_user_backend'']
Obtendrás estas dos variables de sesión.
Puede pasar una variable de request
a una plantilla y allí usar:
{{ request.session.name }}
Tal vez un poco tarde ahora. Si configura directamente TEMPLATE_CONTEXT_PROCESSORS
en settings.py
, perderá todos los valores predeterminados de TEMPLATE_CONTEXT_PROCESSORS
. Esto es lo que hago en mi settings.py
:
from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as DEFAULT_TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_TEMPLATE_CONTEXT_PROCESSORS + (
''django.core.context_processors.request'',
)
la implementación más simple es usar if loop:
{% if ''data'' in request.session %}
django.core.context_processors.request
agregar django.core.context_processors.request
a los procesadores de contexto de su plantilla . Entonces puedes acceder a ellos de esta manera:
{{ request.session.name }}
En caso de que esté usando vistas personalizadas, asegúrese de estar pasando una instancia RequestContext. Ejemplo tomado de la documentation :
from django.shortcuts import render_to_response
from django.template import RequestContext
def some_view(request):
# ...
return render_to_response(''my_template.html'',
my_data_dictionary,
context_instance=RequestContext(request))
Actualización 2013: a juzgar por los votos a favor que aún recibo por esta respuesta, la gente todavía la encuentra útil, más de tres años después de su publicación original. Sin embargo, tenga en cuenta que aunque el código de vista anterior sigue siendo válido, hoy en día hay una manera mucho más simple de hacerlo. render()
es una función muy similar a render_to_response()
, pero usa RequestContext
automáticamente, sin necesidad de pasarlo explícitamente:
from django.shortcuts import render
def some_view(request):
# ...
return render(request, ''my_template.html'', my_data_dictionary)
request.session
es un diccionario como cualquier otro, por lo que solo utiliza el mecanismo de plantilla normal para atributos y miembros:
{{ request.session.name }}
No olvide pasar la solicitud en el contexto de la plantilla, o incluso mejor asegurarse de que está utilizando RequestContext y tener habilitado el procesador de contexto de solicitud. Ver la documentación .