2012-04-15 22 views
9

En mi opinión, puedo imprimir request.user.nombre de usuario, sin embargo, en la plantilla, {{request.user.username}} no Aparecer. Para facilitar esto, eliminé la lógica de la función y estoy importando render_to_response & RequestContext.Django 1.4 - {{request.user.username}} no se procesa en la plantilla

from django.shortcuts import render_to_response 
from django.template import RequestContext 

@login_required 
@csrf_protect 
def form(request): 
    print request.user.username 
    data = {} 
    return render_to_response('form.html', data, context_instance=RequestContext(request)) 

Supongo que tengo un problema con mi settings.py.

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    # Uncomment the next line for simple clickjacking protection: 
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.admin', 
    'django.contrib.admindocs', 
    'src', 
) 

Gracias de antemano por su ayuda-

Respuesta

37

Como mentioned in the documentation, objeto de usuario autenticado se almacena dentro de user variable en las plantillas. documentación mencionada incluye el siguiente ejemplo:

Al renderizar una plantilla RequestContext, la ha iniciado sesión actualmente en el usuario, ya sea una instancia de User o una instancia AnonymousUser, se almacena en la variable de plantilla {{ user }}:

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

EDITAR: Gracias a @buffer, que sacó esta vieja respuesta, la he actualizado con el estado más reciente. Cuando se escribió originalmente, en menos de un mes después de Django 1.4 (que se lanzó a fines de marzo de 2012), era correcto. Pero desde Django 1.5, el método adecuado para obtener un nombre de usuario es llamar al get_username() en la instancia del modelo de usuario. Esto se ha agregado debido a la capacidad de cambiar la clase User (y tener un campo personalizado como nombre de usuario).

+0

Puedo pasar un objeto de usuario a la plantilla, pero ¿no debería ser posible acceder al usuario conectado a través de la solicitud? Parece que la solicitud no es accesible desde la plantilla, sino que está en la vista. – Emile

+0

Bien interesante. Eso es correcto: en lugar de {{request.user.username}} (que utilicé en proyectos anteriores), {{user.username}} funciona. Gracias por la ayuda @tadeck! – Emile

+0

Es preferible usar 'user.get_username' sobre' user.username': https://docs.djangoproject.com/en/dev/ref/contrib/auth/#django.contrib.auth.models.User.get_username – Medorator

5

Consulte la documentación para RequestContext y TEMPLATE_CONTEXT_PROCESSORS.

Si quiere que request esté en el contexto de su plantilla, debe incluir django.core.context_processors.request en su configuración TEMPLATE_CONTEXT_PROCESSORS. No está allí por defecto.

Sin embargo, como Tadeck señaló en su respuesta user ya está disponible si está utilizando la configuración por defecto, ya que django.contrib.auth.context_processors.auth es parte de la lista por defecto para TEMPLATE_CONTEXT_PROCESSORS.

+0

Gracias por la aclaración Brian. Esa es la información que me faltaba. ¿Los TEMPLATE_CONTEXT_PROCESSORS se eliminaron de los proyectos predeterminados? Puede que haya olvidado que los agregué, pero ha pasado un tiempo. – Emile

+0

@EmilePetrone No creo que el comando startproject actual crea un settings.py con 'TEMPLATE_CONTEXT_PROCESSORS'. Podría haberlo hecho al mismo tiempo, pero no estoy seguro. –

+0

@BrianNeal: No quiero pasarle el usuario a las plantillas. ¿Hay alguna manera de desactivarlo permanentemente? – user1050619

Cuestiones relacionadas