Объект 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
, так что это будет несложно. Я бы просто поискал способ кэшировать пользователя и не запускать запрос дважды.