it-swarm.com.de

Django-AttributeError 'User'-Objekt hat kein Attribut' Backend '(Aber ... das tut es?)

Um Benutzer nach der Registrierung anzumelden, stelle ich die Eigenschaft user.backend manuell ein. Das funktioniert normalerweise in meinen Ansichten. In diesem Fall versuche ich, den Benutzer über AJAX zu registrieren. Es wird ein AttributeError ausgelöst. 

Hier ist mein 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-- HIER IST DER AJAX. Es sieht hübsch aus

     //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();
});

Ziemlich genau dieser exakte Code funktioniert für mich in Nicht-Ajax-Ansichten. Was gibt?

Vielen Dank

53
Ben

Sie müssen authenticate aufrufen, bevor Sie login aufrufen können. authenticate setzt ein Attribut für das Objekt, das feststellt, welches Backend es erfolgreich validiert hat, und löscht es für die Anmeldung, was in Ihrem Code nicht vorkommt (und das ist das fehlende Attribut).

Dokumentation: https://docs.djangoproject.com/de/1.8/topics/auth/default/#how-to-log-a-user-in - Schauen Sie sich die kleine Legende an, die besagt "Aufruf von authenticate()". zuerst".

82
Luke Sneeringer

Ich werde dies als Antwort posten. Aber ich schulde es https://stackoverflow.com/users/558699/ben in den obigen Kommentaren und https://stackoverflow.com/a/5837046/1467342 . Ich habe diese Frage gescannt und vermisst, dass ich in den Kommentaren gesucht habe. Das manuelle Hinzufügen eines Backends war für mich bisher zweimal (hackig):

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

In beiden Fällen verlasse ich mich auf andere Authentifizierungsmethoden (E-Mail-Bestätigung und Sitzung mit authentifizierter Sitzung), um die Berechtigung zum Anmelden als dieser Benutzer zu überprüfen.

46
jstaab

in Django 1.10 verwendet Django.contrib.auth.login jetzt ein backend=-Schlüsselwort!

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

0
David Lam