Ошибочное значение: Поле 'phone' ожидало число, но получило 'Admin@gmail.com'
Когда я пытаюсь войти в систему с помощью email, он показывает сообщение об ошибке, но мне нужно, чтобы оно имело комментарий .Код не должен показывать "ValueError: Field 'phone' expected a number but gets 'Admin@gmail.com'".and " ValueError: Поле 'phone' ожидало число, но получило 'Admin@gmail.com'". Ниже приведены коды views.py и login.html и мой чекбокс также не работает. models.py
class User(AbstractUser):
STATUS = (
('Active', 'Active'),
('Inactive', 'Inactive'),
)
roles=(
('Admin','Admin'),
('Consultant','Consultant'),
('Employee','Employee'),
)
username=models.CharField(max_length=100,null=True,blank=True)
first_name=models.CharField(max_length=100,null=True,blank=True)
email = models.EmailField(max_length=50, null=True,blank=True)
phone = models.IntegerField(unique=True)
salary = models.IntegerField(null=True,)
billing = models.IntegerField(null=True,)
amount=models.IntegerField(null=True)
otp=models.IntegerField(null=True,default=None)
desigenation=models.CharField(max_length=100,null=True,blank=True)
rank=models.IntegerField(null=True)
officemail=models.EmailField(max_length=50, null=True,blank=True)
date=models.DateTimeField(auto_now_add=True,null=True,blank=True)
status=models.CharField(max_length=50,choices = STATUS,null=True,blank=True,default="Active")
role=models.CharField(max_length=50,choices = roles,null=True,blank=True)
engagement = models.ManyToManyField('Engagement')
value=models.IntegerField(default=0)
USERNAME_FIELD = 'phone'
REQUIRED_FIELDS = ['email','otp','salary','billing','desigenation','rank','officemail','date','status','role']
objects=UserManager()
class Meta:
ordering =['status']
def __str__(self):
return str(self.first_name)
views.py
def loginf(request):
if request.method=='POST':
phone=request.POST.get('phone')
password=request.POST.get('password')
user = authenticate(username=phone, password=password)
try:
remember = request.POST['checkbox']
if remember:
settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False
except:
is_private = False
settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True
u = User.objects.filter(phone=phone,otp=password).exists()
if u and user is not None:
r=User.objects.filter(phone=phone,otp=password)
status=r[0].status
if status=="Active":
role=r[0].role
if role == "Employee":
login(request,user)
return redirect('listtask')
elif role == "Consultant":
userid=r[0].id
login(request,user)
return redirect('consultatntbilling',userid=userid)
else:
messages.info(request,"Account is Inactive")
return render(request,'login.html')
else:
messages.info(request," Invalid Phone Number or Password")
return render(request,'login.html')
return render(request,'login.html')`
login.html`
Войдите, чтобы продолжить..
<div class="container">
{% for message in messages %}
<div class="alert alert-warning alert-dismissible fade show" role="alert">
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="close"></button>
</div>
{% endfor %}
</div>
<form method ="POST" action="{% url 'loginf' %}">
{% csrf_token %}
<div class="form-group">
<label class="form-control-label">Phone Number</label>
<input class="form-control" name="phone" required>
</div>
<div class="form-group">
<label class="form-control-label">Password</label>
<input class="form-control" name="password" required>
</div>
<!-- <div class="form-group">
<div class="fxt-transformY-50 fxt-transition-delay-3">
<input type="text" class="form-control" placeholder="Phone number" name="phone" required>
</div>
</div>
<div class="form-group">
<div class="fxt-transformY-50 fxt-transition-delay-4">
<input type="password" class="form-control" placeholder="Password" name="password" required>
</div> -->
<div class="checkbox">
<label for="checkbox">
<input type="checkbox" name="checkbox" value="remember-me" /> Remember Me
</label>
</div>
</div>
<div class="form-group">
<div class="fxt-transformY-50 fxt-transition-delay-5">
<div class="fxt-content-between">
<button type="submit" class="fxt-btn-fill">Login</button>
</div>
</div>
</div>
</form>`
В вашей модели User вы написали USERNAME_FIELD = 'phone', django использовал имя пользователя для аутентификации. В вашем случае ваш USERNAME_FIELD является phone, поэтому измените код в представлении на такой
user = authenticate(phone=phone, password=password)
Если вы хотите войти в систему с помощью email измените USERNAME_FIELD=email или если вы хотите войти с помощью телефона или электронной почты, напишите пользовательский метод аутентификации для этого.