web-dev-qa-db-fra.com

Des problèmes avec user.is_authenticated dans Django template

Désolé si vous avez essayé de m'aider lorsque j'ai posé cette question plus tôt. J'ai dû supprimer cette question parce que je n'étais pas autorisé à modifier des informations supplémentaires pour une raison quelconque.

Je travaille sur l'implémentation de l'authentification des utilisateurs sur mon site Django. Tout fonctionne. Mes vues, modèles, URL, etc. sont tous configurés. Les utilisateurs peuvent s'inscrire, se connecter, se déconnecter. problème que je rencontre est avec ce morceau de code:

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

Même lorsque je suis connecté, il affiche toujours "Connexion" en option plutôt que "Déconnexion". Cependant, si je clique sur le lien, il me redirigera vers/profile car c'est ce que la vue lui dit de faire si je suis connecté. Donc, clairement, il sait que je suis connecté, mais le modèle n'est pas readint user.is_authenticated as true.

La vue relative aux demandes de connexion est:

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))
29
Xonal

Si le processeur de contexte d'authentification est activé, user est déjà dans le contexte du modèle, et vous pouvez faire:

{% if user.is_authenticated %}

Si vous souhaitez accéder à request dans le modèle, assurez-vous que vous avez activé processeur de contexte de demande .

Dans votre question, vous utilisez render_to_response. Depuis Django 1.3, il vaut mieux utiliser render au lieu de render_to_response. Utiliser render_to_response Avec RequestContext(request) fonctionne dans Django <= 1.9, mais à partir de Django 1.10), vous devez utiliser le raccourci render si vous voulez que les processeurs de contexte fonctionnent.

return render(request, 'template/login.html', context)
44
Alasdair

Sachez que puisque Django 1.1 le is_authenticated Est décoré avec @ propriété et son comportement diffère.

Pour NON AUTHENTIFIÉ utilisateur appelant {{user.is_authenticated}} résultats:

CallableBool(True) (quand on Django <1.10 c'était True)

Pour AUTHENTIFIÉ utilisateur appelant {{user.is_authenticated}} résultats:

CallableBool(False) (quand on Django <1.10 c'était False)

Si vous devez passer par exemple à votre valeur javascript comme true ou falsevous pouvez le faire en appliquant le filtre |yesno:"true,false"

<script language="javascript"> 
var Django_USER = "{{user.is_authenticated|yesno:"true,false"}}";
</script>
7
andilabs