2017-09-07 23 views
1

私は、ユーザーがis_authenticated=True
とマークされているにもかかわらず、authenticateがバックエンドを割り当てられないため、ログインに失敗した登録フォームを作成しました。私は認証を使用している方法で間違っていますか? (私はここに影響を与えているかどうかわからジャンゴall_authを使用しますがないよに注意?)Django - 認証はユーザーにバックエンドを追加しません

ログイン時()、それは、このエラーを生成:

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

ビュー:

.... 
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) 

プロフィールの書式:

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

あなたの表示コードは非常に混乱しています。 'user'は' authenticate'からの戻り値であり、それに対するパラメータではありません。 –

答えて

2

あなたがauthenticateを呼び出すと、認証が成功した場合、それはユーザーが返されます。 loginに電話するときは、このユーザーを使用する必要があります。

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

カスタム認証バックエンドを持っていない限り、あなたはusername代わりのuserを渡す必要があることに注意してください。

Django 1.10+では、すでにユーザーインスタンスがある場合はauthenticateに電話する必要はありません。あなたがloginを呼び出すときは、たとえば、引数としてバックエンドを提供することができます。

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

の詳細はselecting the authentication backend上のドキュメントを参照してください。

+0

ありがとうございます。返品とユーザーのインスタンスの認証を明確にするためです。 (私はパラメータとしてユーザーの使用を見つけていませんでした、それは事故でした、ありがとう)。それが機能しました。 – Yunti

関連する問題