Объект django 'Loginform' не имеет атрибутов get_user

У меня есть приложение многопользовательского типа с usertype и usertype b я пытаюсь создать форму входа, где большинство логинов находится и должно находиться в форме я получаю эту ошибку

forms.py

class Loginform(forms.Form):
    username = forms.CharField(required=True)
    password = forms.CharField(widget=forms.PasswordInput)

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super().__init__(*args, **kwargs)

    def clean(self):
        username = self.cleaned_data.get("username")
        password = self.cleaned_data.get("password")
        try:
            user = models.User.objects.get(username=username)
            if user.user_a:
                if user.check_password(password):
                    return self.cleaned_data
                else:
                    self.add_error("password", forms.ValidationError("Password is wrong."))
        except models.User.DoesNotExist:
            self.add_error("email", forms.ValidationError("User does not exist."))

views.py

class UseraView(LoginView):
    template_name = 'login.html'
    form_class = Loginform
    success_url = reverse_lazy("home")

Примечание:Есть несколько других постов, связанных с этим, которые не помогли, так как они предназначены для однотипных пользователей, а в моем случае это многопользовательское приложение, поэтому, пожалуйста, не предоставляйте никаких ссылок

LoginView, когда форма действительна, вызывает метод get_user формы . Это происходит потому, что ожидается, что класс формы будет AuthenticationForm или его подклассом.

Вы можете решить эту проблему несколькими способами.

Override UseraView.form_valid

Вы можете переписать ваше представление так, чтобы оно не вызывало метод формы, который вы пропускаете. В этом случае вам нужен какой-то другой способ аутентификации пользователя в представлении.

Подкласс AuthenticationForm

Вместо наследования от form.Form вы могли бы наследовать от уже существующей формы аутентификации Django. Я не думаю, что это помешает вашему методу clean, но, возможно, стоит посмотреть на это снова с новыми инструментами, предоставляемыми новой базой

Определить Loginform.get_user

Вы можете предоставить свой собственный метод, который получает пользователя. Вы уже получаете пользователя в Loginform.clean, так что это будет несложно. Я бы просто поискал способ кэшировать пользователя и не запускать запрос дважды.

Вернуться на верх