所以我有一个带有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中编写的验证来不重复自己。
这是我的代码,谢谢您的帮助!
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
答案 0 :(得分:2)
您正在IntegerFields上使用MinLengthValidator
和MaxLengthValidator
,这将尝试对整数应用len()函数。这就是为什么您会遇到这种错误。您可以将zipcode
和phone
属性更改为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)]