Escribo una etiqueta personalizada en Django que debe mostrar un valor almacenado en una sesión de usuario, pero no puedo encontrar una forma de acceder al objeto de sesión desde una función de etiqueta personalizada. ¿Hay alguna manera de hacerlo, sin asignar manualmente el objeto de sesión a una variable de contexto?En Django, ¿es posible acceder a la sesión de usuario actual desde una etiqueta personalizada?
Respuesta
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.
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))
He encontrado esto útil: http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser
Puede utilizar middleware para captar la información de usuario y almacenarlo con una secuencia de procesamiento local, y luego utilizarlo con su definición de la etiqueta.
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.
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
en el decorador render_to de django-annoying parece ser la mejor opción (como se ve en another question on stackoverflow)
- 1. Cómo acceder a la sesión desde una clase de Java
- 2. ¿Es posible acceder a la clave/valor TempData desde HttpContext?
- 3. django: cómo acceder al usuario de solicitud actual en ModelForm?
- 4. Procesadores de contexto Django: ¿es posible acceder al contexto actual en ContextProcessor?
- 5. ¿Es posible suplantar a un usuario sin iniciar sesión?
- 6. ¿Es posible acceder a información de metadatos adicional desde una pantalla personalizada o una plantilla de editor?
- 7. cómo acceder a la solicitud en un back-end de autenticación personalizada django?
- 8. ¿Cómo iniciar sesión en el usuario de la sesión en Django?
- 9. ¿Cómo acceder a la sesión del usuario de Magento desde fuera de Magento?
- 10. ¿Puedo acceder al estado de la sesión desde un HTTPModule?
- 11. ASP.NET: ¿Cómo acceder a la sesión desde el controlador?
- 12. Python: Cómo "bifurcar" una sesión en django
- 13. Obtener la señal de inicio de sesión del usuario actual en Django
- 14. ¿Cómo acceder a la sesión desde Rails Integration Test?
- 15. Conjunto de formularios de Django usuario actual
- 16. ¿Es posible finalizar manualmente una sesión de Google Analytics?
- 17. ¿Puedo acceder a una cookie desde Socket.io?
- 18. ¿Pueden los filtros personalizados de Django acceder a request.user?
- 19. Django: etiqueta de plantilla de inclusión personalizada MEDIA_URL?
- 20. ¿Es posible generar modelos django desde la base de datos?
- 21. Django: etiqueta de inclusión de representación desde una vista
- 22. cómo acceder a la sesión en el modelo asp.net mvc
- 23. Tomcat: cómo acceder al administrador (sesión) desde el servlet
- 24. ¿Es posible acceder a la variable local externa en PHP?
- 25. ¿es posible compartir datos de sesión desde una aplicación asp.net mvc y una aplicación python?
- 26. Django redirige a la URL personalizada
- 27. ¿Es posible usar RedirectToAction() dentro de una clase personalizada AuthorizeAttribute?
- 28. Acceso a la propiedad de etiqueta personalizada en didSelectRowAtIndexPath
- 29. Grails: etiqueta personalizada dentro de una etiqueta estándar de Grails
- 30. ¿Es posible acceder a un dll de 64 bits desde una aplicación de 32 bits?
me gustaría recomendar la conmutación respuesta a este enfoque, es más limpio. –
Ya tenía ese preprocesador, pero debe haber pasado por alto la propiedad de la sesión. D'oh! Gracias. – knabar
He agregado esto, pero ¿cómo accedo a la solicitud desde dentro de la plantilla? context.session no existe. – Wouter