2010-03-31 23 views
103

Si fijo una variable de sesión en Django, como:Django: accediendo a las variables de sesión desde dentro de una plantilla?

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

¿Hay alguna manera de que pueda acceder a él desde dentro de una plantilla, o tengo que recuperarlo desde un punto de vista, y luego pasarlo 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 utilizar variables de sesión porque es un HttpResponseRedirect, pero el almacenamiento de las variables en una base de datos es demasiado para mis propósitos.)

Por lo tanto - cualquier manera de captar las variables de sesión directamente dentro de una plantilla?

Respuesta

183

es necesario agregar a su django.core.context_processors.requesttemplate context processors. A continuación, puede acceder a ellos de esta manera:

{{ request.session.name }} 

En el caso de utilizar vistas personalizadas asegurarse de que usted está pasando una instancia RequestContext. Ejemplo tomado de 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 upvotes Todavía estoy recibiendo de esta respuesta, la gente sigue encontrando más útiles, más de tres años después de que fue escrito originalmente. 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 utiliza RequestContext de forma automática, sin necesidad de pasar explícitamente:

from django.shortcuts import render 

def some_view(request): 
    # ... 
    return render(request, 'my_template.html', my_data_dictionary) 
+8

Ver http://stackoverflow.com/questions/2246725/django-template-context-processors#answer-9233283 para ver cómo agregar django.core.context_processors.request a sus procesadores de contexto plantilla sin anulando el por defecto. –

+0

si uso HttpResponse en lugar de renderizar, aún podré obtener el atributo de sesión en mi plantilla. Estoy confundido, por favor dime – cafebabe1991

+0

@ cafebabe1991 ¿Qué quieres decir? La clase 'HttpResponse' no se ocupa en absoluto de las plantillas, por lo que la pregunta no parece relevante ... –

13

request.session es un diccionario como cualquier otra, por lo que sólo tiene que utilizar el mecanismo de la plantilla normal que los atributos y los miembros:

{{ request.session.name }} 

No se olvide de pasar la solicitud en el contexto de la plantilla, o incluso mejor, que hace están utilizando RequestContext y tienen habilitado el procesador de contexto de solicitud. Ver the documentation.

5

se puede pasar una variable request a una plantilla y no utilizar:

{{ request.session.name }} 
1

En su settins.py

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

Su punto de vista, tal vez este aspecto.

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)) 
+0

También tuve que agregar 'django.contrib.auth.context_processors.auth' a la tupla TEMPLATE_CONTEXT_PROCESSORS. – Tony

2

primera impresión request.session.keys() continuación

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

Usted obtendrá estas dos variables de sesión.

1

Continua @Ludwik Trammer respuesta, ¿Cómo añadir TEMPLATE_CONTEXT_PROCESSORS

Para Django 1.6, en la configuración.py agregue TEMPLATE_CONTEXT_PROCESSORS refiriendo el siguiente código y luego use {{ request.session.name }} en 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

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

0

Quizás 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', 
) 
7

estoy usando Django 1.9 (marzo de 2016) y para obtener {{ request.session.name}} a trabajar, mi configuración tienen esta ::

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 de la anterior respuestas es: 'django.core.context_processors.request' convirtió 'django.template.context_processors.request'

+1

en Django 1.10, el 'django.template.context_processors.request' ya estaba en el archivo de configuración: D –

Cuestiones relacionadas