0

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

当 自愿日期显示类型 是指定数字时,我正在尝试触发自定义验证。但是,当我运行以下代码时,自愿日期显示类型值为,我期待一个数字/数字。

我已阅读有关表单字段验证的 django 文档,但我看不到我的错误。

目前只有最后一个 else 条件被触发,因为值为 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
4

1 回答 1

1

clean_voluntary_finish_date仅在验证该特定字段时调用,因此其他字段可能尚未“清理”。这意味着当你使用 时self.cleaned_data.get('voluntary_date_display_type'),该字段还没有被清理,所以没有键入cleaned_data,并且该.get()方法将返回None

clean()当验证依赖多个字段时,需要使用 normal方法;如“清理和验证相互依赖的字段”下的 django 表单参考中所述:

假设我们在联系表单中添加另一个要求:如果 cc_myself 字段为 True,则主题必须包含“帮助”一词。我们一次对多个字段执行验证,因此表单的 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
于 2014-11-06T04:16:06.443 回答