Объект 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. ЭТО СМОТРЕТЬ НАСТОЯЩИЙ СТАНДАРТ
//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="#" onclick="location.href='http://nabshack.com/logout/'; return false;">Log Out</a></li><li class="refar_friend"><a href="#" onclick="location.href='http://nabshack.com/referral/'; return false;">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. Что дает?
Спасибо
Ответы
Ответ 1
Вы должны позвонить authenticate
, чтобы позвонить login
. authenticate
устанавливает атрибут объекта, отмечающий, что бэкэнд успешно проверил его и очистил его для входа в систему, что не происходит в вашем коде (и что этот атрибут отсутствует).
Документация: https://docs.djangoproject.com/en/1.8/topics/auth/default/#how-to-log-a-user-in - проверьте маленькую выноску, в которой говорится: "Сначала вызывайте authenticate()
".
Ответ 2
Я отправлю это как ответ, но я должен https://stackoverflow.com/users/558699/ben в комментариях выше, а fooobar.com/info/114116/.... Я просматривал этот вопрос и пропустил то, что я искал, в комментариях. Добавление бэкэнда вручную было (взломанным) исправлением для меня дважды:
user.backend = 'django.contrib.auth.backends.ModelBackend'
login(request, user)
В обоих случаях я полагаюсь на другие методы проверки подлинности (подтверждение электронной почты и сеанс аутентификации администратора) для проверки разрешения входа в систему как этого пользователя.