Pregunta

Estoy trabajando en un pequeño sitio de intranet para una pequeña empresa, 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 reciben una URL de inicio de sesión única, 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 lo amplían.Quiero mostrar el botón de inicio de sesión o registro en 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 manera de hacer esto sin incluir al usuario en cada creación de contexto?

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

¿Fue útil?

Solución

En un sentido más general, de no tener que establecer variables explícitamente en cada vista, parece que quieres considerar escribir la tuya propia. 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.

Otros consejos

Hay No hay necesidad 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 estas usando RequestContext en tus puntos de vista.

Si está utilizando Django 1.4 o la versión 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 uno llama a la plantilla a la vista, SECO

La solución es utilizar un preprocesador.

A:En tu configuración agrega

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

B:En myapp/processor_file_name.py inserte

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

A partir de ahora podrás utilizar funcionalidades de objetos de usuario en tus 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 }}
... 

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

Esta variable de contexto de plantilla no está disponible si Contexto de solicitud no se está utilizando.

@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

Entonces supongo que no hay valores globales que verifique el motor de plantillas.

Pero RequestContext tiene algunas clases precompletadas que puedo examinar para resolver mis problemas.Gracias.

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

Creo que esto debería ser sólo un caso de llamar authenticate() y login() en función del contenido de su cookie.

Editar:@Staale: siempre uso el locals() truco para mi contexto para que todas mis plantillas puedan ver request y entonces 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.De forma predeterminada, 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 a objetos de usuario como este,

{% 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top