TypeError: BaseForm.__init__() получил неожиданный аргумент в виде ключевого слова 'request'
Я использую Django для создания страницы аутентификации (вход, регистрация...) Во время написания программы логина я столкнулся с этой ошибкой, и я не могу понять, откуда она взялась
users/urls.py
path('login/', CustomLoginView.as_view(), name='login'),
users/views.py
class CustomLoginView(LoginView):
form_class = AuthenticationForm
template_name = 'users/login.html'
# shitty patch to bypass the error
def get_form_kwargs(self):
"""Return the keyword arguments for instantiating the form."""
kwargs = super().get_form_kwargs()
# Remove 'request' from kwargs if it exists
kwargs.pop('request', None)
return kwargs
users/form.py
User = get_user_model()
class AuthenticationForm(forms.Form):
identifier = forms.CharField(max_length=100,
required=True,
widget=forms.TextInput(attrs={'placeholder': 'Username, Email, or Phone',
'class': 'form-control',
}))
password = forms.CharField(max_length=50,
required=True,
widget=forms.PasswordInput(attrs={'placeholder': 'Password',
'class': 'form-control',
'data-toggle': 'password',
'id': 'password',
'name': 'password',
}))
remember_me = forms.BooleanField(required=False)
# this is from ChatGPT that suggested it to me to debug the problem... but it didn't clarify my ideas much
def __init__(self, *args, **kwargs):
print("Initialization arguments:", args, kwargs) # Debugging line
super().__init__(*args, **kwargs)
def clean(self):
identifier = self.cleaned_data.get('identifier')
password = self.cleaned_data.get('password')
if identifier and password:
user = authenticate(username=identifier, password=password)
if not user:
try:
user = User.objects.get(email=identifier)
if not user.check_password(password):
raise forms.ValidationError("Invalid login credentials")
except User.DoesNotExist:
# Try to authenticate with phone number
try:
user = User.objects.get(phone=identifier)
if not user.check_password(password):
raise forms.ValidationError("Invalid login credentials")
except User.DoesNotExist:
raise forms.ValidationError("Invalid login credentials")
if user and not user.is_active:
raise forms.ValidationError("This account is inactive.")
self.cleaned_data['user'] = user
return self.cleaned_data
def get_user(self):
return self.cleaned_data.get('user')
результатом работы фрагмента кода ChatGPT является
Initialization arguments: () {'initial': {}, 'prefix': None, 'request': <WSGIRequest: GET '/users/login/'>}
и решается предложенным патчем.
Где/что я делаю неправильно? В чем проблема, которая привела к ошибке?
...последнее, но не менее важное...плохо ли сделать такую страницу входа, имея в одном поле ник, email или телефон, и передать результат в представление и манипулировать так?