2008-12-02 17 views

Respuesta

23

usted debería ser capaz de añadir el procesador de solicitud de contexto en su archivo settings.py:

TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth", 
"django.core.context_processors.debug", 
"django.core.context_processors.i18n", 
"django.core.context_processors.media", 
'django.core.context_processors.request',) 

Esto hará lo mismo que la respuesta actual, sin tener que agregar un archivo personalizado.

+0

me gustaría recomendar la conmutación respuesta a este enfoque, es más limpio. –

+0

Ya tenía ese preprocesador, pero debe haber pasado por alto la propiedad de la sesión. D'oh! Gracias. – knabar

+0

He agregado esto, pero ¿cómo accedo a la solicitud desde dentro de la plantilla? context.session no existe. – Wouter

4

Usted puede hacer esto con procesadores de contexto personalizado (consulte http://docs.djangoproject.com/en/dev/ref/templates/api/)

En este caso, se crearía un nuevo archivo llamado context_processors.py al mismo nivel que el archivo settings.py, que contiene:

def add_session(request): 
    return {'session': request.session} 

a continuación, en el archivo de settings.py, añadir:

TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth", 
"django.core.context_processors.debug", 
"django.core.context_processors.i18n", 
"django.core.context_processors.media", 
'context_processors.add_session',) 

ahora será capaz de hacer referencia al contexto [ 'sesión'] en su etiqueta personalizada.

Tenga en cuenta que esto sólo funcionará para las plantillas prestados con un RequestContext asignado, como en el siguiente código:

def test(request): 
    return render_to_response('test.html',{}, context_instance=RequestContext(request)) 
6

Sin intención de ofender a Sebastian ya que parece ser un truco útil en un punto, pero curiosamente el 24 de diciembre en una entrada de blog sobre el acceso a los datos del usuario en el administrador, James Bennett, gerente de lanzamiento de Django, tenía esto para decir about using the threadlocal hack:

Una gran descargo de responsabilidad de grasa: hay montones y montones de usos potenciales para este tipo de características. Muchos de ellos están equivocados y estúpidos y no deberías probarlos. ... Además, de vez en cuando verá a alguien sugerir que estas características se pueden obtener mediante lo que se conoce como el "hack threadlocal"; esto básicamente implica colocar request.user en una especie de variable mágica disponible a nivel mundial, y es una cosa muy mala de usar si no sabes lo que estás haciendo. En general, también es algo muy malo de usar incluso si sabes lo que estás haciendo, ya que probablemente solo lo estés haciendo porque eres perezoso y no tienes ganas de asegurarte de pasar la información correctamente. Entonces, si ves a alguien sugiriendo que hagas esto usando un "threadlocal", ignora a esa persona.

No digo que deba ignorar a Sebastian, pero podría valer la pena buscar otras vías en lugar de usar threadlocal, que no se considera una buena práctica.

+0

Es un punto importante, pero debo sugerir que tal vez el comentario del Sr. Bennett sobre los programadores sea probablemente" flojo y no se sienta seguro de pasar la información correctamente "no es del todo justa. Un problema recurrente en Django es descubrir cómo pasar la información de forma adecuada. Por lo general, no se trata de ser flojo, sino de tener acceso a las variables que necesita. Eso dicho; obviamente tiene razón, que el truco local es una cosa muy mala. – Teekin

Cuestiones relacionadas