password - El objeto Django-AttributeError ''User'' no tiene ningún atributo ''back-end''(pero... ¿verdad?)
login url django (3)
Para registrar a los usuarios después de registrarlos, configuro manualmente la propiedad user.backend. Por lo general, funciona en mis puntos de vista. En este caso, estoy tratando de registrar al usuario a través de AJAX. Está elevando un AttributeError.
Aquí está mi código:
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()
EDITAR - AQUÍ ESTÁ EL AJAX. PARECE BASTANTE ESTÁNDAR
//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();
});
Casi todo este código exacto funciona para mí en vistas distintas de ajax. ¿Lo que da?
Gracias
Debe llamar a authenticate
antes de poder llamar al login
. authenticate
establece un atributo en el objeto que indica qué backend lo ha validado con éxito y lo borra para el inicio de sesión, lo que no sucede en el código (y ese es el atributo que falta).
Documentación: https://docs.djangoproject.com/en/1.8/topics/auth/default/#how-to-log-a-user-in - echa un vistazo a la pequeña leyenda que dice "llamar a authenticate()
primero" .
Lo publicaré como respuesta, pero se lo debo a en los comentarios anteriores, y a https://.com/a/5837046/1467342 . Estaba escaneando esta pregunta y echaba de menos que lo que estaba buscando estaba en los comentarios. Agregar un backend manualmente ha sido una solución (hacky) para mí dos veces hasta ahora:
user.backend = ''django.contrib.auth.backends.ModelBackend''
login(request, user)
En ambos casos, confío en otros métodos de autenticación (confirmación por correo electrónico y sesión autentificada por el administrador) para verificar el permiso de inicio de sesión como este usuario.
en Django 1.10, django.contrib.auth.login
ahora toma un argumento backend=
keyword!