我正在尝试添加自定义验证作为表单的一部分。
当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
答案 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