2009-06-28 15 views
6

Estoy escribiendo una pequeña aplicación social. Una de las características es escribir el nombre de usuario en el encabezado del sitio. Entonces, por ejemplo, si estoy conectado y mi nombre es Oleg (nombre de usuario), entonces debería ver:Django: Cómo escribir el nombre de los usuarios actuales de cada vista (django)

Hola, Oleg | Haga clic para editar el perfil

De lo contrario, debería ver algo como:

Hola Por favor inscribirse o unirse

Lo que quiero es mostrar esto en todas las páginas de mi sitio web. La solución obvia es pasar el objeto request.user a cada vista de mi sitio. Pero aquí http://www.willmer.com/kb/category/django/ leí que simplemente puedo acceder a peticiones de objetos de cualquier plantilla, simplemente al permitir:

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

No sé por qué, pero en realidad no funcionó :(

Tal vez alguien me puede ayudar y sugerir una solución?

Muchas gracias,

Oleg

Respuesta

7

También tenga en cuenta que debe usar django.core.context_processors.auth en lugar de django.core.context_processors.request si no necesita el contexto completo de la solicitud. Luego puede simplemente escribir:

Hello {{ user.get_full_name }} 

en su plantilla.

No olvide pasar context_instance=RequestContext(request) cuando llame al render_to_response (o use direct_to_template).

+0

Solo una pequeña nota: las vistas genéricas ya tienen context_instance establecido y, por lo tanto, la variable {{user}} ya está disponible. –

0

una vez que haya establecido el contexto p rocess, la solicitud se pasa a la plantilla como una variable llamada request. Para tener acceso al objeto de usuario dentro de la variable que necesita para perforar en ella:

{{ request.user }} 

Aquí está una list of attributes stored in the Django Request object. Más específicamente, aquí está el user attribute.

1

Uso

de django.template RequestContext importación

en lugar de

de Contexto importación django.template

Así que ahora sólo llamar RequestContext (petición, el contexto)

Más here.

6

Probablemente haya dos problemas aquí.

En primer lugar, si redefine TEMPLATE_CONTEXT_PROCESSORS como lo ha hecho, anulará el valor predeterminado, lo que probablemente no sea una buena idea.De forma predeterminada, la configuración ya incluye el procesador auth, que de todos modos le da una variable user. Si usted necesita definitivamente la request, así que debe hacer esto (nota el +=):

TEMPLATE_CONTEXT_PROCESSORS += (
    'django.core.context_processors.request', 
) 

En segundo lugar, tal como se describe en la documentación here al utilizar procesadores de contexto es necesario asegurarse de que está utilizando un RequestContext en su plantilla . Si está utilizando render_to_response debe hacerlo de esta manera:

return render_to_response('my_template.html', 
          my_data_dictionary, 
          context_instance=RequestContext(request)) 
0
{% if user.is_authenticated %} 
<p>Welcome, {{ user.username }}. Thanks for logging in.</p> 
{% else %} 
<p>Welcome, new user. Please log in.</p> 
{% endif %} 

sería suficiente si ha TEMPLATE_CONTEXT_PROCESSORS ya establecido.

0

Creo que con solo agregar locals() puede resolver el problema.

return render_to_response('my_template.html', 
         my_data_dictionary,locals()) 
Cuestiones relacionadas