Uwierzytelnij użytkownika za pomocą adresu e-mail i hasła

Mam formularz, który pozwala tylko użytkownikom na logowanie się za pomocą nazwy użytkownika. Postanowiłem zezwolić tylko użytkownikowi na logowanie się przez e-mail zamiast nazwy użytkownika.

Po pierwsze, nie jest to powielanie jakichkolwiek pytań związanych z logowaniem przez e-mail, ponieważ w moim scenariuszu sprawdzam i uwierzytelniam użytkownika wforms.py zanim przejdzie do ostatecznego logowania w widokach, co da mi szansę na zgłoszenie błędu w przypadku nieprawidłowych haseł logowania itp.

Problemem, przed którym stoję, jest zmodyfikowanie mojegoforms.py aby zgłosić błąd, jeśli wiadomość e-mail nie istnieje, która działa, ale nie pozwoliłaby użytkownikowi zalogować się przez jego 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})

To jest mój oryginalny kod, który pozwala użytkownikom na logowanie się tylko przez nazwę użytkownika

 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

To jest mój zmodyfikowany kod, który pozwala użytkownikom na logowanie się przez e-mail. Dużo myślałem o tym, jak to zrobię, ale jest to najlepszy pomysł, jaki wymyśliłem. Przepraszam, to trochę mylące. Problem polega na tym, że nie pozwoliłby użytkownikowi zalogować się. Nie rozumiem dlaczego.

 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

Czy ktoś może mi pomóc?

questionAnswers(3)

yourAnswerToTheQuestion