it-swarm.com.ru

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

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

Спасибо

53
Ben

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

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

82
Luke Sneeringer

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

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

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

46
jstaab

в Django 1.10 Django.contrib.auth.login теперь принимает аргумент ключевого слова backend=!

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

0
David Lam