2010-07-26 24 views
5

En mi plantilla, Tengo el siguiente:Django funciona user.is_authenticated algunos lugares, otros no

 <ul class="tabbed" id="network-tabs"> 
      {% if user.is_authenticated %} 
      <li><a href="{% url acct-my-profile %}">My Account</a></li> 
      <li><a href="{% url acct-logout %}">Log Out</a></li> 
      {% else %} 
      <li><a href="{% url acct-login %}">Log in</a></li> 
      <li><a href="{% url acct-register %}">Register</a></li> 
      {% endif %} 
     </ul> 

Parece que funciona bien, a menos que haya creado la página tiene un decorador @login_required, en cuyo caso el la página funciona bien, pero la navegación aparece como si el usuario no hubiera iniciado sesión, incluso cuando lo están.

Respuesta

13

Debería verificar su función de vista para ver de dónde viene la variable user. A menos que esté pasando específicamente user en el contexto de la vista, ese es su problema.

Usted hacer tienen acceso a la request.user, sin embargo, y que siempre devolverá cierto en una plantilla representan a partir de una visión que tiene el decorador @login_required.

La razón por la que puedo decir con certeza que no hay nada malo con el decorador, sin embargo, es que en el código de User y AnonymousUser (ubicado en django.contrib.auth.models) el método is_authenticated vuelve estrictamente cierto para User y falso para AnonymousUser. El decorador no puede y no puede cambiar eso. Y lo que eso significa es que su plantilla no está obteniendo realmente un objeto User donde está marcando user.

+8

¡Ah! Perfecto. No estaba pasando al usuario, como dijiste. Pero para otros (ya que me confundió), no puede usar "request.user" en la plantilla, necesita pasar el usuario en su procesamiento a la respuesta como: 'user': request.user, Gracias de nuevo . –

+0

Consulte la respuesta de Alasdair para obtener más información en respuesta a su comentario. –

8

Para seguir desde la respuesta de Gabriel, ¿está la variable user procedente del procesador de contexto de autenticación? Si es así, y está utilizando el acceso directo render_to_response, debe usar una instancia RequestContext.

from django.template import RequestContext 

... 

@login_required 
def some_view(request): 
    # ... 
    return render_to_response('my_template.html', 
          my_data_dictionary, 
          context_instance=RequestContext(request)) 
+1

También es un excelente punto. Estaba a punto de agregar una nota sobre los procesadores de contexto y RequestContext. –

+0

estoy teniendo este problema también: después de iniciar sesión correctamente, vuelvo a dirigir a la página principal, cosa que vista vuelve render_to_response ('miaplicacion/shop_list.html', \t \t \t \t \t \t \t { 'tienda': entry_list,}, \t \t \t \t \t \t \t context_instance = RequestContext (request)) Pero, en este punto, request.user es un AnonymusUser así que cuando se carga la plantilla de página de inicio, user.is_authenticated es siempre falso. ¿Qué puedo estar perdiendo? – juankysmith

+0

Parece que su inicio de sesión no funciona. Si agrega 'print request.user' a su vista de página de inicio, ¿obtiene el usuario que está esperando? Si eso no ayuda, haga una nueva pregunta en lugar de agregar comentarios aquí: no muchas personas leerán estos comentarios, por lo que no obtendrá ayuda. – Alasdair

Cuestiones relacionadas