2008-09-03 12 views
27

Estoy trabajando en un pequeño sitio de intranet para una empresa pequeña, donde el usuario debería poder publicar. 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 una url de inicio de sesión única que establece una cookie que siempre los identificará para futuras solicitudes.Incluir siempre al usuario en el contexto de la plantilla django

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

¿O tendré que hacer mis propios atajos personalizados para configurar el contexto correctamente?

Respuesta

18

En un sentido más general de no tener que establecer explícitamente variables en cada vista, parece que desea ver su propia context processor.

A partir de los documentos:

Un procesador de contexto tiene una interfaz muy simple: es sólo 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.

2

Si puede enganchar su autenticación en el Django authentication scheme, podrá usar request.user.

Creo que esto debería ser solo un caso de llamar a authenticate() y login() según el contenido de su Cookie.

Editar: @Staale - Siempre uso el locals() trick para mi contexto, así que todas mis plantillas pueden ver request y así request.user. Si no lo eres, supongo que no sería tan sencillo.

32

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

@Staale: Adición de usuarios al contexto cada vez que se está llamando la plantilla a la vista, DRY

solución es utilizar un preprocesador

Un: En la configuración de añadir

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

B: en myapp/processor_file_name.py insert

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

A partir de ahora puede utilizar funcionalidades de objetos de usuario en sus plantillas.

{{ user.get_full_name }} 
+0

Django da el error 'Poner 'django.contrib.auth.context_processors.auth' en sus TEMPLATE_CONTEXT_PROCESSORS el establecimiento con el fin de utilizar el administrador application.' E incluso si hago eso, las plantillas todavía no sabe acerca 'usuario'. – hobbes3

+4

@ hobbes3 ya que no está utilizando RequestContext, los procesadores de contexto no se ejecutan. –

+0

@rebus En realidad en mi 'views.py', paso un diccionario simple usando' render_to_resposne' como opuesto a 'RequestContext'. Gracias por la ayuda. – hobbes3

43

No es hay necesidad escribir un procesador de contexto para el objeto de usuario si ya tiene la "django.core.context_processors.auth" en TEMPLATE_CONTEXT_PROCESSORSy si está usando RequestContext en sus puntos de vista.

si está utilizando Django 1.4 o más reciente del módulo se ha trasladado a django.contrib.auth.context_processors.auth

+3

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

+0

Es cierto que debe usar [RequestContext] (https://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext) –

+4

Use render() (https: // docs. djangoproject.com/en/dev/topics/http/shortcuts/#render) de Django 1.3 para incluir siempre RequestContext automáticamente. –

1

su posible por defecto, haciendo los siguientes pasos, asegúrese de que ha añadido el 'contexto django.contrib.auth.context_processors.auth 'en su configuración. Por defecto su agregado en settings.py, por lo que su aspecto como este

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

Y usted puede acceder el usuario objeto como éste,

{% if user.is_authenticated %} 
<p>Welcome, {{ user.username }}. Thanks for logging in.</p> 
{% else %} 
    <p>Welcome, new user. Please log in.</p> 
{% endif %} 

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

+2

También necesita utilizar RequestContext en lugar de Context en este caso. –

3

Los consejos están en cada respuesta, pero una vez más, desde "cero", para los novatos:

los datos de autenticación están en las plantillas (casi) por defecto, 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 }} 
... 

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

Esta plantilla variable de contexto no está disponible si un RequestContext no es bei ng usado.

Cuestiones relacionadas