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

56
为了在注册用户后将其登录,我手动设置了"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 视图中,这段几乎完全一样的代码为我工作正常。怎么回事?

谢谢。


你能添加你的ajax代码吗? - tarkeshwar
你是否在使用 django.contrib.authUser?如果是,那么错误是完全有效的,因为 User 没有该属性。将其添加到 User 的唯一两种方法是通过配置文件,在这种情况下它将是 User.get_profile().backend 或者通过子类,在这种情况下它将是 CustomUser.backend。如果你没有使用 django.contrib.auth,请发布你的 User 模型代码。 - Chris Pratt
我正在使用django.contrib.auth。然而,你的观点并不准确。请参考这篇帖子(https://dev59.com/5lbTa4cB1Zd3GeqP_ogn)。你可以直接在User模型上设置“backend”属性。除了那个线程之外,我已经在其他视图中成功实现了这个功能。我认为这是ajax在起作用。 - Ben
3个回答

83

2
这不是真的,Luke。我知道这一点,因为我通过阅读其他线程以及自己进行实验测试得出了结论。你可以直接设置后端属性。请查看我在上面评论中留下的其他线程。你可能还想在其他地方寻找答案。手动设置后端是一种hack方法,可以达到与调用authenticate相同的效果。 - Ben
5
好的,我认输了。你可以嘲笑调用“authenticate”的效果。但是除非你有充分的理由,否则不应该这样做,因为将来的更新可能会扩展“authenticate”的功能以及Django期望完成的任务。 - Luke Sneeringer

47

我将这篇文章作为答案发布,但是我要感谢上面评论中的https://stackoverflow.com/users/558699/benhttps://dev59.com/5lbTa4cB1Zd3GeqP_ogn#5837046。我扫描了这个问题,错过了我正在寻找的内容在评论中。对我来说,手动添加后端已经是一个可靠的解决方法了,至少两次。

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

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


7
如果用户使用自定义后端,则最好从django.contrib.conf导入设置并分配settings.AUTHENTICATION_BACKENDS。 - Arsham

0

或者你可以直接使用 login(request, user),它不会再抛出错误了。 - serg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接