ユーザーを登録した後にユーザーをサインインするには、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ビューで機能します。何が得られますか?
ありがとう
authenticate
を呼び出す前に、login
を呼び出す必要があります。 authenticate
は、オブジェクトに属性を設定し、どのバックエンドがそれを正常に検証し、ログイン用にクリアしたかを記録します。これはコードでは発生しません(それが欠落している属性です)。
ドキュメント: https://docs.djangoproject.com/en/1.8/topics/auth/default/#how-to-log-a-user-in -という小さなコールアウトをチェックしてください「authenticate()
を最初に呼び出す」。
これを回答として投稿しますが、上記のコメントの https://stackoverflow.com/users/558699/ben と、 https:// stackoverflow。 com/a/5837046/1467342 。私はこの質問をスキャンしていましたが、私が探していたのはコメントにありませんでした。バックエンドを手動で追加することは、これまで2回(ハッキング)修正されました。
user.backend = 'Django.contrib.auth.backends.ModelBackend'
login(request, user)
どちらの場合も、このユーザーとしてログインする権限を確認するために、他の認証方法(電子メール確認と管理者認証セッション)に依存しています。
in Django 1.10、Django.contrib.auth.login
はbackend=
キーワード引数!