Django - 身份验证不会向用户添加后端



我已经创建了一个注册表单,尽管成功创建用户无法登录,因为authenticate无法分配后端,即使然后将用户标记为is_authenticated=True
我正在使用身份验证的方式中有不正确的东西吗?(请注意,我正在使用django all_auth,但不确定在这里有影响吗?)

在login()上,它生成了此错误:

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

调用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')

有关更多信息,请参见选择身份验证后端的文档。

您将设置多个身份验证后端 in 'settings.py; py; 如下所示:

# "settings.py"
AUTHENTICATION_BACKENDS = [
  "django.contrib.auth.backends.ModelBackend",
  # ...,
  # ...,
]

在这种情况下,您需要设置 backend ='django.contrib.auth.backends.modelbackend' to &quot&quort" login()" views.py" 如下所示,错误将解决:

# "views.py"
....
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, backend='django.contrib.auth.backends.ModelBackend')
                             # ↑ ↑ ↑ Here ↑ ↑ ↑

最新更新