Невозможно аутентифицировать пользователя Django с помощью электронной почты вместо имени пользователя
Я пытаюсь реализовать в Django аутентификацию по электронной почте вместо использования имени пользователя по умолчанию. Я обновил модель пользователя и бэкенд аутентификации, но все еще не могу аутентифицировать пользователей по их адресам электронной почты.
views.py
from django.shortcuts import render,HttpResponseRedirect
from .forms import UserLoginForm,UserSignUpForm
from django.contrib.auth import authenticate,login,logout,get_user
from django.contrib import messages
from .models import UserRegister
# Create your views here.
def home(request):
return render(request,'home.html')
def form(request):
if request.method=="POST":
if 'login' in request.POST:
login_form = UserLoginForm(request,data=request.POST)
signup_form =UserSignUpForm()
if login_form.is_valid():
email = login_form.cleaned_data.get('email')
password = login_form.cleaned_data.get('password')
user = authenticate(request,email=email,password=password)
if user is not None:
login(request,user)
messages.success(request, "Successfully logged in!")
return HttpResponseRedirect('/home')
else:
print("Authentication Failed")
messages.error(request,"Invalid email or password")
login_form.add_error(None,"Invalid email or password")
else:
messages.error(request,"Please fix the errors below.")
print("Login form error:",login_form.errors)
print("Non-field errors:", login_form.non_field_errors())
for field in login_form:
print(f"Field Error: {field.name} - {field.errors}")
print(request.POST)
if 'signup' in request.POST:
login_form = UserLoginForm()
signup_form =UserSignUpForm(request.POST)
if signup_form.is_valid():
form_info = UserRegister(
username=signup_form.cleaned_data.get('username'),
email=signup_form.cleaned_data.get('email'),
password=signup_form.cleaned_data.get('password1')
)
form_info.save()
messages.success(request, "Successfully signup!")
return HttpResponseRedirect('/home')
else:
messages.error(request,"Please fix the errors below.")
print("Login form error:",signup_form.errors)
print("Non-field errors:", signup_form.non_field_errors())
for field in signup_form:
print(f"Field Error: {field.name} - {field.errors}")
else:
login_form = UserLoginForm()
signup_form=UserSignUpForm()
return render(request,'form.html',{'login_form':login_form,'signup_form':signup_form})
form.py
from django import forms
from django.contrib.auth.forms import UserCreationForm,AuthenticationForm
from .models import UserRegister
from django.contrib.auth import authenticate
class UserSignUpForm(UserCreationForm):
username = forms.CharField(max_length=50,required=True,widget=forms.TextInput(attrs={'id':'signup-username'}))
email = forms.EmailField(max_length=70,required=True,widget=forms.TextInput(attrs={'id':'signup-email'}))
password1 = forms.CharField(max_length=128,required=True,widget=forms.PasswordInput(attrs={'id':'signup-password1'}))
password2 = forms.CharField(max_length=128,required=True,widget=forms.PasswordInput(attrs={'id':'signup-password2'}))
class Meta:
model = UserRegister
fields = ['username','email','password1','password2']
class UserLoginForm(AuthenticationForm):
email = forms.EmailField(max_length=70, required=True, widget=forms.TextInput(attrs={'id': 'login-email'}))
password = forms.CharField(max_length=128, required=True, widget=forms.PasswordInput(attrs={'id': 'login-password'}))
def clean(self):
email = self.cleaned_data.get('email')
password = self.cleaned_data.get('password')
if email and password:
self.user_cache = authenticate(request=self.request, email=email, password=password)
if self.user_cache is None:
raise forms.ValidationError("Invalid email or password")
return self.cleaned_data
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils import timezone
from django.contrib.auth.hashers import make_password
class UserRegister(AbstractUser):
username = models.CharField(max_length=50,unique=True,db_index=True)
email = models.EmailField(unique=True)
password = models.CharField(max_length=128)
is_active = models.BooleanField(default=True)
last_login = models.DateTimeField(default=timezone.now)
groups = models.ManyToManyField(
'auth.Group',
related_name='custom_user_groups',
blank=True,
help_text='The groups this user belongs to.'
)
user_permissions = models.ManyToManyField(
'auth.Permission',
related_name='custom_user_permissions',
blank=True,
help_text='Specific permissions for this user.'
)
class Meta:
verbose_name = "Custom User "
verbose_name_plural = "Custom Users "
def __str__(self):
return self.username
backends.py
from django.contrib.auth.backends import ModelBackend
from .models import UserRegister
class CustomAuthBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = UserRegister.objects.get(username=username)
if user.check_password(password):
return user
except UserRegister.DoesNotExist:
print('Unable to authenticate')
return None
def get_user(self, user_id):
try:
return UserRegister.objects.get(pk=user_id)
except UserRegister.DoesNotExist:
return None
form.html
ошибка:-
Unable to authenticate
Login form error: <ul class="errorlist"><li>username<ul class="errorlist"><li>This field is required.</li></ul></li><li>__all__<ul class="errorlist nonfield"><li>Invalid email or password</li></ul></li></ul>
Non-field errors: <ul class="errorlist nonfield"><li>Invalid email or password</li></ul>
Field Error: username - <ul class="errorlist"><li>This field is required.</li></ul>
Field Error: password -
Field Error: email -
<QueryDict: {'csrfmiddlewaretoken': ['N9kPmMtMtS54Te0Ln8icxMb3UBLmhilagTu5eEPGDKr8irXGOg7qCTFdsbNozh4z'], 'email': ['jain22hardik@gmail.com'], 'password': ['hj@123456'], 'login': ['']}>
[22/Mar/2025 00:20:55] "POST /form/ HTTP/1.1" 200 4855
Вот что я пробовал до сих пор:
Обновлена модель AUTH_USER_MODEL на пользовательскую модель User с EMAIL_FIELD, установленным на email.
Настроили форму входа, заменив имя пользователя на email, и включили поле для ввода пароля.
Внедрение пользовательского бэкенда аутентификации для проверки подлинности пользователей с помощью их адресов электронной почты.
Несмотря на эти изменения, форма входа по-прежнему ожидает поле имени пользователя и выдает ошибку «Invalid email or password». Как я могу решить эту проблему и полностью перейти на аутентификацию по электронной почте в Django?
Любое руководство или совет будут высоко оценены. Дайте мне знать, если дополнительные детали или фрагменты кода помогут