Afin de connecter les utilisateurs après les avoir enregistrés, j'ai défini manuellement la propriété user.backend. Cela fonctionne normalement dans mes vues. Dans ce cas, j'essaie d'enregistrer l'utilisateur via AJAX. Il soulève une AttributeError.
Voici mon code:
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()
EDIT-- VOICI L'AJAX. IL SEMBLE JOLI STANDARD
//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();
});
Ce code exact fonctionne assez bien dans les vues non-ajax. Ce qui donne?
Merci
Vous devez appeler authenticate
avant de pouvoir appeler login
. authenticate
définit un attribut sur l'objet en indiquant quel est le moteur qui l'a validé avec succès et en le supprimant pour la connexion, ce qui ne se produit pas dans votre code (c'est l'attribut manquant).
Documentation: https://docs.djangoproject.com/fr/1.8/topics/auth/default/#how-to-log-a-user-in - consultez le petit appel qui indique "appelant authenticate()
premier".
Je posterai ceci comme une réponse, mais je le dois à https://stackoverflow.com/users/558699/ben dans les commentaires ci-dessus et à https://stackoverflow.com/a/5837046/1467342 . J'étais en train de scanner cette question et j'ai raté que ce que je cherchais se trouvait dans les commentaires. Ajouter un serveur manuellement a été un correctif (hacky) pour moi deux fois jusqu'à présent:
user.backend = 'Django.contrib.auth.backends.ModelBackend'
login(request, user)
Dans les deux cas, je m'appuie sur d'autres méthodes d'authentification (confirmation de courrier électronique et session authentifiée par l'administrateur) pour vérifier l'autorisation de connexion en tant qu'utilisateur.
dans Django 1.10, Django.contrib.auth.login
prend maintenant un argument de mot clé backend=
!