2010-07-26 13 views
5

Nel mio modello, ho il seguente:Django user.is_authenticated funziona alcuni luoghi, non altri

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

Sembra funzionare bene, a meno che stato creato la pagina ha un decoratore @login_required, nel qual caso la la pagina funziona bene ma la navigazione appare come se l'utente non abbia effettuato l'accesso, anche quando lo è.

risposta

13

Controllare la funzione di visualizzazione per vedere da dove proviene la variabile user. A meno che tu non stia specificatamente passando user nel contesto dalla vista, questo è il tuo problema.

È fare hanno accesso a request.user, però, e che sarà sempre return true in un modello reso da una vista che ha il @login_required decoratore.

Il motivo per cui te lo posso dire per certo che non c'è niente di sbagliato con il decoratore, però, è che nel codice per User e AnonymousUser (che si trova nel django.contrib.auth.models) il metodo is_authenticated ritorna strettamente vero per User e falso per AnonymousUser. Il decoratore non lo fa e non può cambiarlo. E ciò significa che il tuo modello non sta effettivamente ottenendo un oggetto User dove stai controllando user.

+8

Ah! Perfezionare. Non stavo passando l'utente affatto, proprio come hai detto tu. Ma per gli altri (dal momento che mi ha confuso), non è possibile utilizzare "request.user" nel modello, è necessario passare attraverso l'utente nel rendering per rispondere come: 'utente': request.user, Grazie ancora . –

+0

Vedere la risposta di Alasdair per ulteriori informazioni in risposta al tuo commento. –

8

Per seguire la risposta di Gabriel, la variabile user proviene dal processore di contesto auth? In tal caso, e si sta utilizzando il collegamento render_to_response, è necessario utilizzare un'istanza 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

Anche un punto eccellente. Stavo per aggiungere una nota su processori di contesto e RequestContext. –

+0

Sto avendo anche questo problema: dopo il login correttamente, rioriento alla home page, wich vista restituisce render_to_response ('frontend/shop_list.html', \t \t \t \t \t \t \t { 'shop': entry_list,}, \t \t \t \t \t \t context_instance = RequestContext (richiesta)) Ma, a questo punto, request.user è un AnonymusUser, quindi quando viene caricato il modello di home page, user.is_authenticated è sempre falso. Cosa posso mancare? – juankysmith

+0

Sembra che il tuo login non funzioni. Se si aggiunge 'print request.user' alla vista della propria pagina iniziale, si ottiene l'utente che si sta aspettando? Se questo non aiuta, per favore fai una nuova domanda invece di aggiungere commenti qui - non molte persone leggeranno questi commenti, quindi non avrai alcun aiuto. – Alasdair

Problemi correlati