Python 使用带有admin-TypeError的Django验证器;类型为'的对象;int';没有len();

Python 使用带有admin-TypeError的Django验证器;类型为'的对象;int';没有len();,python,django,django-models,django-forms,django-rest-framework,Python,Django,Django Models,Django Forms,Django Rest Framework,因此,我有一个面向客户的电子商务应用程序,带有Django管理界面。我希望使用管理员的员工能够创建用户。问题是我内置的自定义正则表达式验证只适用于面向客户的一方,当员工希望使用admin创建新用户时,我使用Django验证程序在尝试创建用户时会抛出一个错误 我想知道(1)是否有一种方法可以重用我的UserManager类(继承自models.Manager),该类处理客户端验证,同时使用Django admin。如果不是,那么(2)如果我依赖Django验证器,我如何清理代码以避免抛出以下错误:

因此,我有一个面向客户的电子商务应用程序,带有Django管理界面。我希望使用管理员的员工能够创建用户。问题是我内置的自定义正则表达式验证只适用于面向客户的一方,当员工希望使用admin创建新用户时,我使用Django验证程序在尝试创建用户时会抛出一个错误

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

TypeError: "object of type 'int' has no len()
我做了一些家庭作业试图弄明白这一点,并找到了以下线索:

这基本上解释了本例引发的错误,因为它试图对int而不是列表调用len()。我不明白的是,为什么当用户自己注册时,我在面向客户的方面没有遇到同样的错误

无论如何,考虑到我如何设置UserManager,我不知道如何实现该解决方案。我没有使用Django表单,并且尝试过使用一些干净的方法,但是我也尝试着通过重用我已经在UserManager中编写的验证来避免重复我自己

这是我的代码,谢谢你的帮助

型号.py
类用户管理器(models.Manager):
def验证(自验证、postData验证、错误验证):
错误={}
如果错误\u验证=='寄存器':
如果不是NAME_REGEX.match(postData['first_NAME']):
错误['first_name']=“first name只能包含字母。”
如果不是NAME_REGEX.match(postData['last_NAME']):
错误['last_name']=“姓氏只能包含字母。”
elif User.objects.filter(email=postData['email']):
错误['email']=“电子邮件已被使用。”
elif len(postData['password'])<8:
错误['password']=“密码必须包含8个或更多字符。”
elif not postData['password']==postData['confirm_password']:
错误['password']=“两个密码必须匹配!”
如果错误\u验证==“登录”:
user=user.objects.filter(email=postData['email'])
如果不是用户或不是bcrypt.checkpw(postData['password'].encode(),用户[0]。password.encode()):
错误['user_login']=“无效凭据。”
返回错误
类用户(models.Model):
first_name=models.CharField(最大长度=50)
last_name=models.CharField(最大长度=50)
dob=models.DateField()
地址=models.CharField(最大长度=100)
城市=模型.CharField(最大长度=35)
state=models.CharField(最大长度=2)
zipcode=models.IntegerField(验证器=[MinLengthValidator(5),MaxLengthValidator(10)])
phone=models.IntegerField(验证器=[MinLengthValidator(10),MaxLengthValidator(10)])
email=models.CharField(最大长度=65)
密码=models.CharField(最大长度=255)
已创建\u at=models.DateField(auto\u now\u add=True)
更新的\u at=models.DateField(auto\u now=True)
objects=UserManager()
定义(自我):
返回self.email

您正在IntegerFields上使用
MinLengthValidator
MaxLengthValidator
,这将尝试对整数应用len()函数。这就是为什么你会犯这样的错误。您可以将您的
zipcode
phone
属性更改为CharField,或者只删除验证器。

您正在IntegerFields上使用
MinLengthValidator
MaxLengthValidator
,这将尝试对整数应用len()函数。这就是为什么你会犯这样的错误。您可以将
zipcode
phone
属性更改为CharField,或者只删除验证器。

需要注意的是CharField没有最小长度属性。

因此,作为一种不明智的选择,您可以使用Min/MaxValueValidator Min/MaxValueValidator,而不是使用Min/MaxLengthValidator。最酷的是,您可以将验证器子类化以处理自定义错误消息:

型号.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)]

需要注意的是,CharField没有最小长度属性。

因此,作为一种不明智的选择,您可以使用Min/MaxValueValidator Min/MaxValueValidator,而不是使用Min/MaxLengthValidator。最酷的是,您可以将验证器子类化以处理自定义错误消息:

型号.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)]

我还要补充一点,邮政编码和电话号码不是整数,而是数字串。整数最适合于数学运算,而不是数据的表示。我最终可能会换成查菲尔德。我想我只是懒得用带有charfield的正则表达式来过滤数字,而且我仍然固执地认为我可以按照自己的方式进行过滤。我还想补充一点,邮政编码和电话号码不是整数,而是数字字符串。整数最适合于数学运算,而不是数据的表示。我最终可能会换成查菲尔德。我想我只是懒洋洋地使用正则表达式和charfield来过滤数字,而且固执地认为我仍然可以按照自己的方式工作。