Django - 自定义验证错误

时间:2014-11-06 04:02:20

标签: django validation django-forms django-validation

我正在尝试添加自定义验证作为表单的一部分。

当voluntary_date_display_type是指定的数字时,我试图跳过自定义验证。但是,当我运行以下代码时,voluntary_date_display_type值为,我期待一个数字/数字。

我已经在form field validation上阅读了django文档,但我看不到我的错误。

目前只触发最终的其他条件,因为值为None。

有人可以指出我做错了吗?

这是我的forms.py文件中的代码:

class Meta:
    model = VoluntaryDetails

    fields = (
        .......
        'voluntary_date_display_type',
        .......
    )

def clean_voluntary_finish_date(self):

    voluntary_display_type = self.cleaned_data.get('voluntary_display_type')
    voluntary_start_date = self.cleaned_data.get('voluntary_start_date')
    voluntary_finish_date = self.cleaned_data.get('voluntary_finish_date')
    voluntary_date_display_type = self.cleaned_data.get('voluntary_date_display_type')

    if voluntary_display_type == 0:
        if voluntary_finish_date is not None and voluntary_start_date is not None:
            if voluntary_start_date > voluntary_finish_date:
                if voluntary_date_display_type == 2 or voluntary_date_display_type == 3:
                    raise forms.ValidationError(_("To Date must be after the From Date."))
                elif voluntary_date_display_type == 4 or voluntary_date_display_type == 5:
                    raise forms.ValidationError(_("Finish Date must be after the Start Date."))
                elif voluntary_date_display_type == 6 or voluntary_date_display_type == 7:
                    raise forms.ValidationError(_("End Date must be after the Begin Date."))
                elif voluntary_date_display_type == 8:
                    raise forms.ValidationError(_("This Date must be after the other Date."))
                elif voluntary_date_display_type == 9 or voluntary_date_display_type == 10:
                    raise forms.ValidationError(_("This Duration date must be after the other Duration date."))
                else:
                    raise forms.ValidationError(_("Completion Date must be after the Commencement Date."))

    return voluntary_finish_date

1 个答案:

答案 0 :(得分:1)

clean_voluntary_finish_date仅在验证特定字段时调用,因此其他字段可能尚未清除"。这意味着当您使用self.cleaned_data.get('voluntary_date_display_type')时,该字段尚未清除,因此cleaned_data中没有关键字,.get()方法将返回None

当验证取决于多个字段时,您需要使用正常的clean()方法;正如django表格reference中所述"清理和验证彼此依赖的字段"

  

假设我们在联系表单中添加了另一项要求:   cc_myself字段为True,主题必须包含单词" help"。我们   正在一次对多个字段进行验证,所以   form的clean()方法是一个很好的选择。 请注意我们是   在这里谈论表单上的clean()方法,而早些时候我们   正在为一个字段写一个clean()方法。保持这个很重要   在确定验证的位置时,字段和表单的区别是明确的   的东西。字段是单个数据点,表单是集合   字段。

     

当调用表单的clean()方法时,所有个人   将运行字段清理方法(前两节),所以   self.cleaned_data将填充任何幸存下来的数据   远。所以你还需要记住允许的事实   您想要验证的字段可能无法在初始阶段幸存   个别现场检查。

您所要做的就是:

def clean(self):
    cleaned_data = super(YourFormClassName, self).clean()
    # copy and paste the rest of your code here
    return cleaned_data # this is not required as of django 1.7