Django: ¿acceder a las variables de sesión desde una plantilla?

133

Si configuro una variable de sesión en Django, como:

request.session["name"] = "name"

¿Hay alguna forma 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, ¿alguna forma de tomar variables de sesión directamente dentro de una plantilla?

AP257
fuente

Respuestas:

224

Debe agregar django.core.context_processors.requesta sus procesadores de contexto de plantilla . Entonces puedes acceder a ellos de esta manera:

{{ request.session.name }}

En caso de que esté utilizando vistas personalizadas, asegúrese de pasar una instancia de RequestContext. Ejemplo tomado de la documentación :

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 todavía recibo por esta respuesta, la gente todavía lo encuentra útil, más de tres años después de que se escribió originalmente. Sin embargo, tenga en cuenta que, aunque el código de vista anterior sigue siendo válido, hoy en día existe una forma mucho más sencilla de hacerlo. render()es una función muy similar a render_to_response(), pero se usa RequestContextautomáticamente, sin necesidad de pasarla explícitamente:

from django.shortcuts import render

def some_view(request):
    # ...
    return render(request, 'my_template.html', my_data_dictionary)
Ludwik Trammer
fuente
9
Consulte stackoverflow.com/questions/2246725/… para saber cómo agregar django.core.context_processors.request a sus procesadores de contexto de plantilla sin anular los valores predeterminados.
Rick Westera
si uso HttpResponse en lugar de renderizar, aún podré obtener el atributo de sesión en mi plantilla. Estoy confundido, por favor dígame
cafebabe1991
@ cafebabe1991 ¿Qué quieres decir? La HttpResponseclase no trata con plantillas en absoluto, por lo que la pregunta no parece relevante ...
Ludwik Trammer
Sí, en realidad hice un experimento para darme cuenta de eso al final. Mala pregunta. lo siento
cafebabe1991
18

request.session es un diccionario como cualquier otro, por lo que solo usa el mecanismo de plantilla normal para atributos y miembros:

{{ request.session.name }}

No olvide pasar la solicitud al 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 .

Daniel Roseman
fuente
11

Estoy usando Django 1.9 (marzo de 2016) y para ponerme {{ request.session.name}}a trabajar, 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: se 'django.core.context_processors.request'convirtió'django.template.context_processors.request'

lunamystry
fuente
2
en Django 1.10, django.template.context_processors.requestya estaba en el archivo de configuración: D
Thai Tran
6

Puede pasar una requestvariable a una plantilla y usar:

{{ request.session.name }}
Luz plateada
fuente
2

Primero imprimir request.session.keys()luego

request.session['_auth_user_id']
request.session['_auth_user_backend']

Obtendrá estas dos variables de sesión.

Namita Maharanwar
fuente
2

la implementación más simple es usar el bucle if:

{% if 'data' in request.session %}
cryptoKTM
fuente
1

En tu settins.py

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
)

Tu punto de vista, quizás 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))
Pjl
fuente
También tuve que agregar 'django.contrib.auth.context_processors.auth' a la tupla TEMPLATE_CONTEXT_PROCESSORS.
Tony
1

Respuesta continua de @Ludwik Trammer, Cómo agregar TEMPLATE_CONTEXT_PROCESSORS

Para django 1.6, en settings.py agregue TEMPLATE_CONTEXT_PROCESSORS haciendo referencia al código siguiente y luego utilícelo {{ 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

Tenga en cuenta que, debe usar ese código completo en la configuración. Si se usa "django.core.context_processors.request"solo, se anulará la configuración predeterminada.

Sree
fuente
0

Tal vez un poco tarde ahora. Si se establece directamente TEMPLATE_CONTEXT_PROCESSORSen settings.py, perderá toda predeterminado TEMPLATE_CONTEXT_PROCESSORSvalor. 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',
)
conejo.aaron
fuente