如果所有字段都为空,Django表单将引发常规验证错误

如果所有字段都为空,Django表单将引发常规验证错误,django,forms,Django,Forms,我有一个表单,其中没有一个字段是单独需要的,但是如果所有字段都为空,我想引发一个验证错误。最好的方法是什么?我尝试了以下方法,但无效: def clean(self): cleaned_data = super(SearchForm, self).clean() if len(cleaned_data) == 0: raise forms.ValidationError(ugettext_lazy("You must fill at least one field

我有一个表单,其中没有一个字段是单独需要的,但是如果所有字段都为空,我想引发一个验证错误。最好的方法是什么?我尝试了以下方法,但无效:

def clean(self):
    cleaned_data = super(SearchForm, self).clean()
    if len(cleaned_data) == 0:
        raise forms.ValidationError(ugettext_lazy("You must fill at least one field!"))

您应该检查每个条目并确认所有值均为空,而不是检查清理后的数据的长度(每个表单字段应始终包含一个条目)

下面是一个例子,说明了如何做到这一点

def clean(self):
    cleaned_data = super(SearchForm, self).clean()
    form_empty = True
    for field_value in cleaned_data.itervalues():
        # Check for None or '', so IntegerFields with 0 or similar things don't seem empty.
        if field_value is not None and field_value != '':
            form_empty = False
            break
    if form_empty:
        raise forms.ValidationError(ugettext_lazy("You must fill at least one field!"))
    return cleaned_data   # Important that clean should return cleaned_data!

您应该检查每个条目并确认所有值均为空,而不是检查清理后的数据的长度(每个表单字段应始终包含一个条目)

下面是一个例子,说明了如何做到这一点

def clean(self):
    cleaned_data = super(SearchForm, self).clean()
    form_empty = True
    for field_value in cleaned_data.itervalues():
        # Check for None or '', so IntegerFields with 0 or similar things don't seem empty.
        if field_value is not None and field_value != '':
            form_empty = False
            break
    if form_empty:
        raise forms.ValidationError(ugettext_lazy("You must fill at least one field!"))
    return cleaned_data   # Important that clean should return cleaned_data!

忽略只填充空格的字段:
而不是字段值。isspace()

忽略只填充空格的字段:
而不是字段值。isspace()

我同意这个答案,但在检查字段是否为“空”时,一定要小心测试是否正确。空的字符串字段将是“”,而不是“无”。但是一个为空的整数字段可能应该是None,因为0可能是一个有效的输入。在后一种情况下,如果您使用“是”或“不是”来判断字段是否为空,您将在0上生成一个假阳性。@AndrewG。是的,重要的是要确保它实际上是空的。您还需要注意设置为
False
@AndrewG的
BooleanField
s。我想你的意思是,如果你做的是
如果不是整数,你就会产生一个假阳性。使用
is None
==None
可以很好地工作。@agf Yes,
is None
可以工作——但对字符串不起作用,因为它们是“”而不是None。因此,如果不考虑正确的空值是什么,就不能对所有字段使用
is None
。添加了一些示例代码,因为这里显然有些混乱。希望这能有所帮助。我同意这个答案,但在检查字段是否为“空”时,一定要小心测试是否正确。空的字符串字段将是“”,而不是“无”。但是一个为空的整数字段可能应该是None,因为0可能是一个有效的输入。在后一种情况下,如果您使用“是”或“不是”来判断字段是否为空,您将在0上生成一个假阳性。@AndrewG。是的,重要的是要确保它实际上是空的。您还需要注意设置为
False
@AndrewG的
BooleanField
s。我想你的意思是,如果你做的是
如果不是整数,你就会产生一个假阳性。使用
is None
==None
可以很好地工作。@agf Yes,
is None
可以工作——但对字符串不起作用,因为它们是“”而不是None。因此,如果不考虑正确的空值是什么,就不能对所有字段使用
is None
。添加了一些示例代码,因为这里显然有些混乱。希望有帮助。