Incluyendo siempre al usuario en el contexto de la plantilla de django.

Estoy trabajando en un pequeño sitio de intranet para una pequeña empresa, donde el usuario debería poder publicar. Me he imaginado un mecanismo de autenticación muy simple en el que las personas simplemente ingresan su dirección de correo electrónico, y se les envía un url de inicio de sesión único, que establece una cookie que siempre los identificará para futuras solicitudes.

En la configuración de mi plantilla, tengo base.html, y las otras páginas extienden esto. Quiero mostrar el botón de inicio de sesión o registro en el archivo base.html, pero ¿cómo puedo asegurarme de que las variables necesarias sean siempre una parte del contexto? Parece que cada vista simplemente configura el contexto a su gusto y no existe una población de contexto global. ¿Hay una manera de hacer esto sin incluir al usuario en cada creación de contexto?

¿O tendré que crear mis propios accesos directos personalizados para configurar el contexto correctamente?

En un sentido más general de no tener que establecer explícitamente las variables en cada vista, suena como si quisieras mirar tu propio procesador de contexto .

De los documentos:

Un procesador de contexto tiene una interfaz muy simple: es solo una función de Python que toma un argumento, un objeto HttpRequest y devuelve un diccionario que se agrega al contexto de la plantilla. Cada procesador de contexto debe devolver un diccionario.

No es necesario escribir un procesador de contexto para el objeto de usuario si ya tiene el "django.core.context_processors.auth" en TEMPLATE_CONTEXT_PROCESSORS y si está utilizando RequestContext en sus vistas.

Si está utilizando django 1.4 o más reciente, el módulo se ha movido a django.contrib.auth.context_processors.auth

@Ryan: la documentación sobre preprocesadores es un poco pequeña

@Staale: Agregar usuario al contexto cada vez que se llama la plantilla a la vista, DRY

La solución es utilizar un preprocesador.

A : En su configuración agregue

 TEMPLATE_CONTEXT_PROCESSORS = ( 'myapp.processor_file_name.user', ) 

B : en myapp / processor_file_name.py insertar

 def user(request): if hasattr(request, 'user'): return {'user':request.user } return {} 

A partir de ahora, podrá utilizar las funcionalidades de objetos de usuario en sus plantillas.

 {{ user.get_full_name }} 

Las sugerencias están en cada respuesta, pero una vez más, desde cero, para los novatos:

Los datos de autenticación están en plantillas (casi) de forma predeterminada, con un pequeño truco:

en views.py :

 from django.template import RequestContext ... def index(request): return render_to_response('index.html', {'var': 'value'}, context_instance=RequestContext(request)) 

en index.html :

 ... Hi, {{ user.username }} var: {{ value }} ... 

Desde aquí: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates

Esta variable de contexto de plantilla no está disponible si no se está utilizando un RequestContext .

@Dave Para usar {{user.username}} en mis plantillas, tendré que usar requestcontext en lugar de solo un mapa / hash normal: http://www.djangoproject.com/documentation/templates_python/#subclassing-context- requestcontext

Así que supongo que no hay globales que compruebe el motor de plantillas.

Pero el RequestContext tiene algunas clases prepopuladas que puedo analizar para resolver mis problemas. Gracias.

Si puede conectar su autenticación al esquema de autenticación Django , podrá utilizar request.user .

Creo que esto debería ser simplemente un caso de llamada a authenticate() y login() basado en el contenido de su Cookie.

Edit: @Staale – Siempre uso el truco locals() para mi contexto, de modo que todas mis plantillas pueden ver request y request.user . Si no es así, supongo que no sería tan sencillo.

es posible de forma predeterminada, al realizar los siguientes pasos, asegúrese de haber agregado el contexto ‘django.contrib.auth.context_processors.auth’ en su configuración. Por defecto, se agrega en settings.py, por lo que se ve así.

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

Y puedes acceder al objeto de usuario como este,

 {% if user.is_authenticated %} 

Welcome, {{ user.username }}. Thanks for logging in.

{% else %}

Welcome, new user. Please log in.

{% endif %}

Para obtener más información, consulte aquí http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates