为了在注册用户之后登录,我手动设置了user.backend属性.在我看来,这通常是可行的.在本例中,我try 通过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视图中使用完全相同的代码.怎么回事?

谢谢

推荐答案

你必须先打authenticate,然后才能打login.authenticate在对象上设置一个属性,指出哪个后端成功验证了它,并清除它以供登录,这在您的代码中没有发生(这是缺少的属性).

文档:https://docs.djangoproject.com/en/1.8/topics/auth/default/#how-to-log-a-user-in--查看一个小标注,上面写着"先打authenticate()".

Django相关问答推荐

如何使用Django';S生成的字段来统计相关对象?

Django测试:如何模拟Django_apps.get_Model()的LookupError

如何在Django REST框架中管理序列化程序?

如何在uwsgi中创建单个日志(log)文件?

如何将我的函数添加到值参数?

lower() 在 None 上被调用

Django 和 HTML 无法从指定时间开始视频

Django ModelForm提交按钮不起作用

遍历django模板中的外键相关表

Django 独立脚本

如何在 django tests.py 中创建管理员用户

如何从 django 自定义中间件类返回 rest_framework.response 对象?

将网络测功机添加到 Heroku django 应用程序时如何克服Coudn't find that formation错误?

如何将 Django forms.ChoiceField 呈现为 Twitter Bootstrap 下拉菜单

Python 社区里的小马是怎么回事?

在 docker 容器中创建 django 超级用户而不输入密码

如何在 django 中分离我的模型?

获取 django 应用的绝对路径

如何在 Django 中使用动态外键?

访问 django 管理模板中的对象