Аутентифицировать пользователя, используя электронную почту и пароль

У меня есть форма, которая позволяет пользователям входить только через имя пользователя. Я решил разрешить пользователю вход только по электронной почте вместо имени пользователя.

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

Проблема, с которой я сталкиваюсь - я изменил свойforms.py вызвать ошибку, если электронная почта не существует, которая работает, но это не позволит пользователю войти через его электронную почту.

 def LoginRequest(request):
     form = LoginForm(request.POST or None)    
     if request.POST and form.is_valid():
         user = form.login(request)
         if user:
             login(request, user)
             return HttpResponseRedirect(reverse('Hello'))

     return render(request, 'login.html',{'form': form})

Это мой оригинальный код, который позволяет пользователям входить только через имя пользователя

 class LoginForm(forms.Form):
     username = forms.CharField()
     password = forms.CharField(
        widget=forms.PasswordInput(render_value=False)
        )

     def clean(self):        
         username = self.cleaned_data.get('username')
         password = self.cleaned_data.get('password')
         user = authenticate(username=username, password=password)
         if not user or not user.is_active:
             raise forms.ValidationError("Sorry, that login was invalid. Please try again.")
         return self.cleaned_data

     def login(self, request):
         username = self.cleaned_data.get('username')
         password = self.cleaned_data.get('password')
         user = authenticate(username=username, password=password)
         return user

Это мой модифицированный код, который позволяет пользователям входить только по электронной почте. Я много думал о том, как я это сделаю, но это лучшая идея, которую я придумал. Извините, это немного сбивает с толку. Проблема в том, что он не позволит пользователю войти в систему. Я не понимаю почему.

 class LoginForm(forms.Form):
     username = forms.CharField()
     password = forms.CharField(
            widget=forms.PasswordInput(render_value=False)
        )

     def clean(self):       
         user = self.cleaned_data.get('username')
         password = self.cleaned_data.get('password')

         if User.objects.filter(email=user).exists():
             password = self.cleaned_data.get('password')
             user = authenticate(username=user.username, password=password)
             if not user or not user.is_active:
                 raise forms.ValidationError("Sorry, that login was invalid. Please try again.")
             return self.cleaned_data

     def login(self, request):
         username = self.cleaned_data.get('username')
         password = self.cleaned_data.get('password')
         user = authenticate(username=username, password=password)
         return user

Может кто-нибудь, пожалуйста, помогите мне?

Ответы на вопрос(3)

Ваш ответ на вопрос