2013-06-10 13 views
24

Scusa se hai provato ad aiutarmi quando l'ho chiesto prima. Ho dovuto cancellare quella domanda perché non mi è stato permesso di modificare ulteriori informazioni per qualche motivo.Problemi con user.is_authenticated nel template django

Sto lavorando per implementare l'autenticazione utente sul mio sito Web django. Tutto funziona. I miei punti di vista, i modelli, gli URL, ecc. Sono tutti impostati. Gli utenti possono registrarsi, accedere, disconnettersi. Il problema che sto avendo è con questo pezzo di codice:

{% if request.user.is_authenticated %} 
     <li><a href="/logout">Log Out</a></li> 
     {% else %} 
     <li><a href="/login">Log In</a></li> 
     {% endif %} 

Anche quando ho effettuato l'accesso, è ancora visualizzato "Log In" come opzione piuttosto che "Log Out". Tuttavia, se faccio clic sul link, verrà reindirizzato a/profile perché è quello che la vista dice di fare se ho effettuato l'accesso. Quindi, chiaramente sa che sono loggato, ma il modello non è readint user.is_authenticated come true.

La vista riguardanti il ​​login richieste è:

def LoginRequest(request): 
    if request.user.is_authenticated(): 
     return HttpResponseRedirect('/profile/') 
    if request.method == 'POST': 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      profile = authenticate(username=username, password=password) 
      if profile is not None: 
       login(request, profile) 
       return HttpResponseRedirect('/profile/') 
      else: 
       return render_to_response('template/login.html', {'form': form}, context_instance=RequestContext(request)) 
     else: 
      return render_to_response('template/login.html', {'form': form}, context_instance=RequestContext(request)) 
    else: 
     ''' user is not submitting the form, show them login form ''' 
     form = LoginForm() 
     context = {'form': form} 
     return render_to_response('template/login.html', context, context_instance = RequestContext(request)) 

risposta

40

Se il processore contesto autenticazione è abilitato, quindi user è già nel contesto del modello, e si può fare:

{% if user.is_authenticated %} 

Se vuoi accedere a request nel modello, assicurati di aver abilitato lo request context processor.

Nella domanda si sta utilizzando render_to_response. Sin da Django 1.3, è stato preferibile utilizzare render anziché render_to_response. L'utilizzo di render_to_response con RequestContext(request) funziona in Django < = 1.9, ma da Django 1.10 in poi è necessario utilizzare il collegamento render se si desidera che i processori di contesto funzionino.

return render(request, 'template/login.html', context) 
+0

miei processori contesto template sono ("django.contrib.auth.context_processors.auth " "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media", "django.core.context_processors.static", " Django. core.context_processors.tz ", " django.contrib.messages.context_processors.messages ") qual è il percorso per la richiesta? – Xonal

+0

Il percorso è indicato nella documentazione a cui mi sono collegato. – Alasdair

+0

Oh, non mi ero accorto di aver lasciato la richiesta. user.is_authenticated in là. Ho provato ad aggiungerlo perché pensavo che sarebbe stato d'aiuto, ma non lo è stato. Il modello non funziona con o senza "request." lì – Xonal

4

essere consapevoli del fatto che, dal momento Django 1.10 il is_authenticated è decorata con @property e comportamento è diverso.

Per non autenticato utente chiamante {{}} user.is_authenticated risultati:

CallableBool(True) (quando in Django < 1.10 era True)

Per autenticato utente chiamante {{} user.is_authenticated } risultati:

CallableBool(False) (quando su Django < 1,10 era False)

Se è necessario passare ad esempio per il vostro valore come javascript true o false si può fare con l'applicazione del filtro |yesno:"true,false"

<script language="javascript"> 
var DJANGO_USER = "{{user.is_authenticated|yesno:"true,false"}}"; 
</script> 
Problemi correlati