web-dev-qa-db-fra.com

Django-AttributeError L'objet 'Utilisateur' n'a pas d'attribut 'backend' (Mais ... c'est le cas?)

Afin de connecter les utilisateurs après les avoir enregistrés, j'ai défini manuellement la propriété user.backend. Cela fonctionne normalement dans mes vues. Dans ce cas, j'essaie d'enregistrer l'utilisateur via AJAX. Il soulève une AttributeError. 

Voici mon code:

 def register_async(request):
    if request.method=='POST':

    userform=MyUserCreationForm(request.POST)
    if userform.is_valid():
        #username of <30 char is required by Django User model.  I'm storing username as a hash of user email 

        user=userform.save(commit=False)
        user.username=hash(user.email)
        user.backend='Django.contrib.auth.backends.ModelBackend'
        user.save()


        auth.login(request,user)
        user_status=1
        user_fname=user.first_name
        user_data=[{'user_status':user_status, 'user_fname':user_fname}]
        json_data=json.dumps(user_data)
        response=HttpResponse()
        response['Content-Type']="text/javascript"
        response.write(json_data)
        return response 

    else:
        user_data=[{'user_status':"0"}]
        json_data=json.dumps(user_data)
        response=HttpResponse()
        response['Content-Type']="text/javascript"
        response.write(json_data)
        return response 
else:
    return HttpResponse()

EDIT-- VOICI L'AJAX. IL SEMBLE JOLI STANDARD

     //ajax registration.  
$('input#register_submit').click(function(event){
    $(this).attr('disabled','disabled');
    $('<div class="register-animation"><img src="{{site}}media/ajax-loader3.gif"/></div>').appendTo('#register_modal_btn');

    $.post("/register/", $('div#register_side form').serialize(), 
        function(data){
            $.each(data,function(){
            if(this.user_status==1){
                $('.register-animation').remove();
                $('.right_section .top').html('<ul><li class="sep_nav">Hi, '+ this.user_fname + '</li><li class="sep+nav"><a href="http://nabshack.com/logout/">Log Out</a></li><li class="refar_friend"><a href="http://nabshack.com/referral/">Refer a friend and get $50</a></li></ul>');
                $('#post_login_modal').dialog("close");

                $('a.login').unbind('click');
                $('li a.account').unbind('click');

            }       
            else{
            $('input#register_submit').removeAttr('disabled');
            $('.register-animation').remove();
            window.location='{{site}}register';
            }

        });
    },'json');
    return false;
    event.stopPropagation();
});

Ce code exact fonctionne assez bien dans les vues non-ajax. Ce qui donne?

Merci

53
Ben

Vous devez appeler authenticate avant de pouvoir appeler login. authenticate définit un attribut sur l'objet en indiquant quel est le moteur qui l'a validé avec succès et en le supprimant pour la connexion, ce qui ne se produit pas dans votre code (c'est l'attribut manquant).

Documentation: https://docs.djangoproject.com/fr/1.8/topics/auth/default/#how-to-log-a-user-in - consultez le petit appel qui indique "appelant authenticate() premier".

82
Luke Sneeringer

Je posterai ceci comme une réponse, mais je le dois à https://stackoverflow.com/users/558699/ben dans les commentaires ci-dessus et à https://stackoverflow.com/a/5837046/1467342 . J'étais en train de scanner cette question et j'ai raté que ce que je cherchais se trouvait dans les commentaires. Ajouter un serveur manuellement a été un correctif (hacky) pour moi deux fois jusqu'à présent:

user.backend = 'Django.contrib.auth.backends.ModelBackend'
login(request, user)

Dans les deux cas, je m'appuie sur d'autres méthodes d'authentification (confirmation de courrier électronique et session authentifiée par l'administrateur) pour vérifier l'autorisation de connexion en tant qu'utilisateur.

46
jstaab

dans Django 1.10, Django.contrib.auth.login prend maintenant un argument de mot clé backend=!

https://code.djangoproject.com/ticket/24855

0
David Lam