Ошибочное значение: Поле '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 или если вы хотите войти с помощью телефона или электронной почты, напишите пользовательский метод аутентификации для этого.

Вернуться на верх