Django-AttributeError 'User' объект не имеет атрибута 'backend' (но .... это так?) - PullRequest
53 голосов
/ 17 мая 2011

Чтобы подписать пользователей после их регистрации, я вручную установил свойство 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-представлениях для меня. Что дает?

Спасибо

Ответы [ 3 ]

82 голосов
/ 18 мая 2011

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

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

46 голосов
/ 21 мая 2014

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

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

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

0 голосов
/ 02 мая 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...