我正在尝试在我的Django 1.8应用程序中实现通用视图,以便Django可以为我处理验证/重定向循环。
我创建了一个模型:
class Customer(models.Model):
custid = models.CharField(max_length=4, verbose_name='CID (4 alphanumeric uppercase)', validators=[validators.CIDValidator])
customer_shortcode = models.CharField(max_length=7, verbose_name='Customer Code (7 chars, uppercase, no spaces)', validators=[validators.ShortnameValidator])
description = models.CharField(max_length=30, blank=True)
并为我的两个验证字段中的每一个定义了验证器:
class CIDValidator(RegexValidator):
regex = r'^[A-Z0-9]{4}$'
message = 'CID is a 4-character uppercase alphanumeric value'
class ShortnameValidator(RegexValidator):
regex = r'^[A-Z0-9_]{1,7}$'
message = 'Shortname should be uppercase, no spaces, alphanumeric'
(此时,我预计管理员界面会在我添加客户时使用验证器,但事实并非如此)
对于实际的应用程序,我为Customer类创建了一个ModelForm:
class CustomerForm(ModelForm):
class Meta:
model = Customer
fields = ['custid', 'customer_shortcode', 'description']
和从CreateView继承的View类:
class CustomerCreateView(CreateView):
model = Customer
form_class = CustomerForm
def get_success_url(self):
return reverse('customer_list')
当我在生成的表单中输入无效数据时,我仍然没有得到验证错误。
据我所知,我只需要在ModelForm上覆盖clean()或clean_xxx()以进行额外的验证,而不是为此,但实际上还不清楚。我想在尽可能少的地方保持关于什么构成有效值的知识 - 模型字段上的验证器会做什么。
这里缺少什么?我怀疑我在模型验证和表单验证之间感到困惑......
答案 0 :(得分:3)
TL; DR:在模型字段定义中指定此类验证器时,应该传递实例而不是类( public PXAction<PMTask> SyncPMTaskWithJira;
[PXButton(CommitChanges = true,
ImageUrl = "http://i.stack.imgur.com/uIcP0.jpg?s=64&g=1",
DisabledImageUrl =
"https://www.gravatar.com/avatar/1d02905a73147ffff3eb0e953a609abd?s=328&d=identicon&r=PG",
HoverImageUrl = "http://i.stack.imgur.com/uIcP0.jpg?s=64&g=1")]
[PXUIField(DisplayName = "Sync With Jira")]
protected void syncPMTaskWithJira()
{}
而不是validators.CIDValidator()
)。
更长的解释
Django验证器need to be callables。尝试调用你正在传递的类将通过python的创建序列来调用一个实例,调用validators.CIDValidator
和__new__
,它将返回该类的实例 - 但是它不会执行任何操作验证字段值的条款。
您正在进行子类化的Django验证器也有一个__init__
方法,当您尝试调用该类的实例时会运行该方法,并且它会负责验证和提升__call__
s