Объект Django-AttributeError 'User' не имеет атрибута 'backend' (но... он делает?)

Чтобы подписать пользователей после регистрации, я вручную устанавливаю свойство user.backend. Обычно это работает в моих взглядах. В этом случае я пытаюсь зарегистрировать пользователя через AJAX. Он поднимает AttributeError.

Вот мой код:

 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()

ИЗМЕНИТЬ - ЗДЕСЬ AJAX. ЭТО СМОТРЕТЬ НАСТОЯЩИЙ СТАНДАРТ

     //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="#" onclick="location.href='http://nabshack.com/logout/'; return false;">Log Out</a></li><li class="refar_friend"><a href="#" onclick="location.href='http://nabshack.com/referral/'; return false;">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();
});

В значительной степени этот точный код работает для меня не-ajax. Что дает?

Спасибо

Ответ 1

Вы должны позвонить authenticate, чтобы позвонить login. authenticate устанавливает атрибут объекта, отмечающий, что бэкэнд успешно проверил его и очистил его для входа в систему, что не происходит в вашем коде (и что этот атрибут отсутствует).

Документация: https://docs.djangoproject.com/en/1.8/topics/auth/default/#how-to-log-a-user-in - проверьте маленькую выноску, в которой говорится: "Сначала вызывайте authenticate()".

Ответ 2

Я отправлю это как ответ, но я должен https://stackoverflow.com/users/558699/ben в комментариях выше, а fooobar.com/info/114116/.... Я просматривал этот вопрос и пропустил то, что я искал, в комментариях. Добавление бэкэнда вручную было (взломанным) исправлением для меня дважды:

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

В обоих случаях я полагаюсь на другие методы проверки подлинности (подтверждение электронной почты и сеанс аутентификации администратора) для проверки разрешения входа в систему как этого пользователя.