web-dev-qa-db-ja.com

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があります。 ITアイテムプリティスタンダード

     //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 。私はこの質問をスキャンしていましたが、私が探していたのはコメントにありませんでした。バックエンドを手動で追加することは、これまで2回(ハッキング)修正されました。

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

どちらの場合も、このユーザーとしてログインする権限を確認するために、他の認証方法(電子メール確認と管理者認証セッション)に依存しています。

47
jstaab

in Django 1.10、Django.contrib.auth.loginbackend=キーワード引数!

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

0
David Lam