Django-AttributeError'User'对象没有属性'backend'(但......它确实如此?)

Ben*_*Ben 53 authentication django django-models django-authentication

为了在注册用户后对其进行签名,我手动设置了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()
Run Code Online (Sandbox Code Playgroud)

编辑 - 这里是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();
});
Run Code Online (Sandbox Code Playgroud)

几乎这个确切的代码适用于非ajax视图.是什么赋予了?

谢谢

Luk*_*ger 82

你必须先打电话authenticate才能打电话login.authenticate在对象上设置一个属性,注意哪个后端已成功验证它并清除它以进行登录,这在代码中没有发生(这是缺少的属性).

文档:https://docs.djangoproject.com/en/1.8/topics/auth/default/#how-to-log-a-user-in - 查看" authenticate()先呼叫" 的小标注.

  • 好吧,点了承认.你可以模拟调用`authenticate`的*效果*.但除非你有充分的理由,否则你不应该这样做,因为未来的某些更新可能会扩展`authenticate`以及Django预期会做什么. (5认同)
  • 这不是真的,卢克.我知道通过阅读其他线程以及通过自己测试来实验.您可以直接设置后端属性.看看我在上面的评论中留下的其他帖子.您可能也希望在其他地方寻找.手动设置后端是一个hack,实现与调用身份验证相同的影响. (2认同)

jst*_*aab 47

我会将此作为答案发布,但我在上面的评论中将其归功于/sf/users/39108961/,以及/sf/answers/408593251/.我正在扫描这个问题而错过了我在寻找的内容.到目前为止,手动添加后端对我来说是一个(hacky)修复程序两次:

user.backend = 'django.contrib.auth.backends.ModelBackend'
login(request, user)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我都依赖其他身份验证方法(电子邮件确认和管理员身份验证会话)来验证以此用户身份登录的权限.

  • 虽然最好从django.contrib.conf导入设置并分配settings.AUTHENTICATION_BACKENDS,以防使用时有自定义后端. (7认同)