Django CreateView和验证

时间:2015-06-03 10:11:21

标签: django validation

我正在尝试在我的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()以进行额外的验证,而不是为此,但实际上还不清楚。我想在尽可能少的地方保持关于什么构成有效值的知识 - 模型字段上的验证器会做什么。

这里缺少什么?我怀疑我在模型验证和表单验证之间感到困惑......

1 个答案:

答案 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