2014-08-31 5 views
1

Ceci suit de mon autre question, car il faudra probablement une réponse différente.'is_authenticated' retourne toujours false dans le modèle

Le code dans mon modèle retourne toujours faux:

{% if request.user.is_authenticated %} 
     <p>I'm logged in</p> 
    {% else %} 
     <p>I am anonymous</p> 
    {% endif %} 

Je comprends des documents que je dois inclure « django.contrib.auth.context_processors.auth » dans TEMPLATE_CONTEXT_PROCESSORS en settings.py donc je ont fait comme suit:

TEMPLATE_CONTEXT_PROCESSORS = (
    "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", 
    "django.contrib.auth.context_processors.auth", #Added 
) 

Quant à mon views.py, je me sers du render_to_response() mais pense que ce peut être l'origine du problème. Je dois aussi passer un utilisateur à partir de la base de données dans le contexte, mais ont ajouté le troisième paramètre context_instance=RequestContext(request)

def public_profile(request, username_in_url): 
    user = User.objects.get(username = username_in_url) 
    context = { 
     'user': user,  
    } 

    return render_to_response('public_profile.html', context, context_instance=RequestContext(request)) 

Pourquoi request.user.is_authenticated revenir encore faux, même si un utilisateur est connecté? En utilisant la même méthode dans views.py fonctionne correctement par exemple.

if request.user.is_authenticated(): 
     return render_to_response('public_profile.html', context) 
    else: 
     return render_to_response('public_profile_anon.html', context) 
+0

Cela fonctionne-t-il si vous utilisez plutôt user.is_authenticated dans votre modèle? –

+0

Si je le change en user.is_authenticated alors il a l'effet inverse! il retourne toujours ** vrai **! – Matchday

Répondre

5

Le documentation pour django.contrib.auth.context_processors.auth dit que ce processeur de contexte définit deux variables: user et perms. Et user est

Une instance auth.User représentant l'utilisateur connecté actuellement (ou une instance AnonymousUser, si le client n'est pas connecté).

Ainsi, bien que dans votre code Python vous accéderiez request.user pour effectuer votre chèque, dans le modèle, il est user.

Le problème avec votre cas spécifique est que vous passez également un dictionnaire qui définit user sur la base de username_in_url. Cela se heurte à la variable définie par django.contrib.auth.context_processors.auth.

Alors:

  1. Modifier le dictionnaire (qui vous avez nommé context) de sorte que user a un nom différent. (Et changer les références à dans votre modèle.)

  2. Changer votre modèle pour vérifier {% if user.is_authenticated %}.

+0

juste ... merci. – Matchday

Questions connexes