Autenticar usuario mediante correo electrónico y contraseña

Tengo un formulario que solo permite a los usuarios iniciar sesión a través de un nombre de usuario. Decidí permitir solo al usuario iniciar sesión por correo electrónico en lugar de nombre de usuario.

Primero, esto no es una duplicación de ninguna pregunta relacionada con el registro por correo electrónico porque, en mi caso, valido y autentico al usuario enforms.py antes de continuar con el inicio de sesión final en las vistas, me da la oportunidad de generar un error por las contraseñas de inicio de sesión incorrectas, etc.

El problema que estoy enfrentando es que modifiqué miforms.py para generar un error si el correo electrónico no existe, lo que funciona pero no permite que el usuario inicie sesión a través de su correo electrónico.

 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 es mi código original que solo permite a los usuarios iniciar sesión a través de un nombre de usuario

 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 es mi código modificado que solo permite a los usuarios iniciar sesión por correo electrónico. Pensé mucho en cómo lo haría, pero esta es la mejor idea que se me ocurrió. Lo siento, es un poco confuso. El problema es que no permitiría al usuario iniciar sesión. No entiendo 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

¿Puede alguien ayudarme por favor?

Respuestas a la pregunta(3)

Su respuesta a la pregunta