Использование валидаторов Django с admin - TypeError: "объект типа 'int' не имеет len()"

Поэтому у меня есть приложение для электронной коммерции с интерфейсом администратора Django. Я хочу, чтобы сотрудники, которые будут использовать администратора, могли создавать пользователей. Проблема заключается в том, что встроенная проверка правильности регулярных выражений применима только к клиентской стороне, и когда сотрудник хочет создать нового пользователя с помощью администратора, мое использование Django Validators выдает ошибку при попытке создать пользователя.

Мне было интересно, если (1) был способ повторно использовать мой класс UserManager (унаследованный от models.Manager), который обрабатывает проверку на стороне клиента, с администратором Django. Если нет, то (2), если бы я полагался на Django Validators, как я мог очистить код, чтобы не выдавать такие ошибки, как:

TypeError: "object of type 'int' has no len()

Я сделал небольшую домашнюю работу, пытаясь выяснить это, и нашел эту тему: TypeError: объект типа 'int' не нуждается в помощи len() при ошибке

Это в основном объясняет, что в этом примере выдается ошибка, потому что он пытается вызвать len() для int вместо списка. Чего я не понимаю, почему я не получаю ту же ошибку на стороне клиента, когда пользователь регистрируется?

В любом случае, я не могу понять, как реализовать решение, учитывая то, как я настроил свой UserManager. Я не использую Django Forms и пытался дурачиться с некоторыми из чистых методов, но я также пытаюсь не повторяться, повторно используя проверку, которую я уже написал в UserManager.

Вот мой код, спасибо за любую помощь!

models.py

class UserManager(models.Manager):
    def validation(self, postData, error_validation):
    errors = {}
    if error_validation == 'register':
        if not NAME_REGEX.match(postData['first_name']):
            errors['first_name'] = "First name can only contain letters."
        if not NAME_REGEX.match(postData['last_name']):
            errors['last_name'] = "Last name can only contain letters."
        elif User.objects.filter(email=postData['email']):
            errors['email'] = "Email already being used."
        elif len(postData['password']) < 8:
            errors['password'] = "Password must contain 8 or more characters."
        elif not postData['password'] == postData['confirm_password']:
            errors['password'] = "Both passwords must match!"
    if error_validation == 'login':
        user = User.objects.filter(email=postData['email'])
        if not user or not bcrypt.checkpw(postData['password'].encode(), user[0].password.encode()):
            errors['user_login'] = "Invalid credentials."
    return errors


class User(models.Model):
    first_name      = models.CharField(max_length=50)
    last_name       = models.CharField(max_length=50)
    dob             = models.DateField()
    address         = models.CharField(max_length=100)
    city            = models.CharField(max_length=35)
    state           = models.CharField(max_length=2)
    zipcode         = models.IntegerField(validators=[MinLengthValidator(5), MaxLengthValidator(10)])
    phone           = models.IntegerField(validators=[MinLengthValidator(10), MaxLengthValidator(10)])
    email           = models.CharField(max_length=65)
    password        = models.CharField(max_length=255)
    created_at      = models.DateField(auto_now_add=True)
    updated_at      = models.DateField(auto_now=True)
    objects         = UserManager()
    def __str__(self):
        return self.email

2 ответа

Ты используешь MinLengthValidator а также MaxLengthValidator на IntegerFields, который попытается применить функцию len() к целым числам. Вот почему вы получили такую ​​ошибку. Вы можете изменить свой zipcode а также phone атрибуты CharField, или просто удалите валидаторы.

Стоит отметить, что CharField не имеет атрибута min_length.

Так что в качестве опрометчивой альтернативы вместо использования Min/MaxLengthValidator вы можете использовать Min/MaxValueValidator Min/MaxValueValidator. Что здорово, вы можете создать подкласс валидаторов для обработки пользовательских сообщений об ошибках:

models.py

from django.core.validators import MinValueValidator, MaxValueValidator


class ZipcodeMaxValueValidator(MaxValueValidator):
    message = ("AWWW YEA ERROR!!")

class User(models.Model):
    zipcode = models.IntegerField(validators=[MinValueValidator(99999), ZipcodeMaxValueValidator(99999)]
Другие вопросы по тегам