Использование валидаторов Django с admin - TypeError: «объект типа 'int' не имеет len ()" - PullRequest
0 голосов
/ 21 сентября 2018

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

0 голосов
/ 21 сентября 2018

Следует отметить, что 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)]
0 голосов
/ 21 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...