with password contrib auth abstractuser django authentication django-models django-authentication

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.