Autenticar usuário usando email e senha

Eu tenho um formulário que permite apenas que os usuários façam login por meio do nome de usuário. Decidi apenas permitir que o usuário faça o login via e-mail em vez do nome de usuário.

Em primeiro lugar, isso não é uma duplicação de qualquer questão relacionada ao registro por email, porque no meu cenário, eu valido e autentico o usuário emforms.py antes que ele prossiga para o login final em views, isso me dá a chance de gerar um erro para senhas de login incorretas, etc.

A questão que estou enfrentando é que eu modifiquei meuforms.py para gerar um erro se o e-mail não existir que funciona, mas não permitiria que o usuário fizesse login via e-mail.

 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})

Este é o meu código original, que permite apenas que os usuários façam login por meio do nome de usuário

 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

Este é o meu código modificado, que permite apenas que os usuários façam login por email. Eu pensei muito sobre como eu faria, mas esta é a melhor ideia que eu criei. Desculpe, é um pouco confuso. O problema é que não permitiria o login do usuário. Eu não entendo porque.

 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

Alguém por favor pode me ajudar?

questionAnswers(3)

yourAnswerToTheQuestion