将Django验证程序与admin一起使用-TypeError:“类型为'int'的对象没有len()”

时间:2018-09-21 02:34:50

标签: python django django-models django-forms django-rest-framework

所以我有一个带有Django Admin界面的电子商务客户应用程序。我希望将使用管理员的员工能够创建用户。问题是我内置的自定义正则表达式验证仅适用于面向客户的一面,当员工想使用管理员创建新用户时,我对Django Validators的使用在尝试创建用户时会引发错误。 >

我想知道(1)是否有一种方法可以重用我的UserManager类(继承自models.Manager),该类还可以使用Django admin处理客户端的验证。如果不是,那么(2)如果我要依赖Django验证程序,我该如何清理代码以免抛出诸如以下错误:

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

我做了一些功课,试图弄清楚这个问题,发现了这个线程:TypeError: object of type 'int' has no len() error assistance needed

这基本上解释了此示例抛出的错误,是因为它试图在int而不是列表上调用len()。我没有得到的是为什么当用户注册自己时,为什么在面向客户方也不会出现同样的错误?

无论如何,鉴于我设置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 :(得分:2)

您正在IntegerFields上使用MinLengthValidatorMaxLengthValidator,这将尝试对整数应用len()函数。这就是为什么您会遇到这种错误。您可以将zipcodephone属性更改为CharField,或仅删除验证器。

答案 1 :(得分:0)

要注意的一件事是 CharField没有min_length属性。

因此,作为不明智的选择,您可以使用Min / MaxValueValidator Min / MaxValueValidator来代替Min / MaxLengthValidator。很棒的是,您可以将验证器子类化以处理自定义错误消息传递:

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)]