2017-09-07 3 views
1

J'ai créé un formulaire d'inscription qui, bien que crée avec succès un utilisateur ne parvient pas à se connecter en tant authenticate ne parvient pas à assigner un back-end, même si l'utilisateur est alors marqué comme is_authenticated=True
Y at-il quelque chose incorrect dans la façon dont j'utilise l'authentification? (notez que je utilise django all_auth mais pas sûr si cela a un impact ici?)Django - Authentifier ne pas ajouter à l'utilisateur backend

Lors de la connexion() il a généré cette erreur:

ValueError:You have multiple authentication backends configured and therefore must provide the backend argument or set the backend attribute on the user.

Vue:

.... 
form = ProfileForm(request.POST) 
    if form.is_valid(): 
     user_profile, user = form.save() 
     authenticate(request, user=form.cleaned_data['email'], 
        password=form.cleaned_data['password1']) 
     login(request, user) 

models.py

class User(AbstractUser): 
    def __str__(self): 
     return self.username 

    def get_absolute_url(self): 
     return reverse('users:detail', kwargs={'username': self.username}) 


class UserProfile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL) 
    TITLE_CHOICES = (
     ..... 
    ) 
    title = models.CharField(max_length=5, null=True, choices=TITLE_CHOICES) 
    date_of_birth = models.DateField() 
    primary_phone = PhoneNumberField() 
    EMPLOYMENT_CHOICES = (
     (....,...) 
    ) 
    employment_status = models.CharField(max_length=35, choices=EMPLOYMENT_CHOICES) 

forme de profil:

class ProfileForm(allauthforms.SignupForm): 
    title = FieldBuilder(UserProfile, 'title',) 

    first_name = forms.CharField(max_length=30) 
    last_name = forms.CharField(max_length=30) 

    date_of_birth = FieldBuilder(UserProfile, 'date_of_birth', widget=SelectDateWidget()) 
    primary_phone = FieldBuilder(UserProfile, 'primary_phone') 

    employment_status = FieldBuilder(UserProfile, 'employment_status') 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.fields["employment_status"].choices = [("", "---- Select your Employment Status ----"), ] + list(
      self.fields["employment_status"].choices)[1:] 


    def save(self, *args): 
     data = self.cleaned_data 
     user = User.objects.create_user(
      username=data['email'], 
      email=data['email'], 
      password=data['password1'], 
      first_name=data['first_name'], 
      last_name=data['last_name'], 
     ) 
     instance = UserProfile.objects.create(
      user=user, 
      date_of_birth=data['date_of_birth'], 
      primary_phone=data['primary_phone'], 
      title=data['title'], 
      employment_status=data['employment_status'], 
     ) 
     return instance, user 
+0

Votre code d'affichage est très déroutant. 'user' est la valeur renvoyée par' authenticate', pas un paramètre. –

Répondre

2

Lorsque vous appelez authenticate, elle retourne un utilisateur si l'authentification a réussi. Vous devez utiliser cet utilisateur lorsque vous appelez login.

user = authenticate(request, username=form.cleaned_data['email'], 
        password=form.cleaned_data['password1']) 
login(request, user) 

Notez que si vous avez un backend d'authentification personnalisé, vous devez passer username au lieu de user.

Dans Django 1.10+, vous n'avez pas besoin d'appeler authenticate si vous avez déjà l'instance d'utilisateur. Lorsque vous appelez login, vous pouvez fournir le back-end comme argument, par exemple:

login(request, user, backend='django.contrib.auth.backends.ModelBackend') 

Voir la documentation sur selecting the authentication backend pour plus d'informations.

+0

Merci, pour clarifier les retours d'authentification et l'instance de l'utilisateur. (Oups je n'ai pas repéré l'utilisation de l'utilisateur comme paramètre, c'était un accident, merci.). Cela a fait fonctionner. – Yunti