成功调用带有自定义错误消息的is_valid()后显示django表单

时间:2010-11-24 17:23:01

标签: django validation

我有一个django表单,首先通过调用form.is_valid()来验证其数据。如果不是,则重新显示表单,并显示有关无效数据的错误消息。 现在,如果is_valid()为true,我尝试将数据保存在ldap后端。如果form.cleaned_data与ldap数据类型不对应,我从ldap save方法得到一个Exception。现在我想在这种情况下做的是重新显示带有错误消息的表单,就像form.is_valid()之后发生的事情返回false一样。 我试过阅读一些文档和一些django源代码,但找不到我可以在哪里找到它。

另一种方法是仔细构建(自定义)表单字段的形式,以“保证”数据已完全符合ldap语法。 但我想知道我抓住ldap语法错误并以方便的形式显示它们。因此,如果我可以进入该形式,重新显示机制将使我成为一个快乐的小程序员: - )

任何想法或提示?

3 个答案:

答案 0 :(得分:2)

在您的类扩展forms.Form的类下,添加以下方法之一,假设您在某处定义了is_valid_ldap_data()

表示整个表格:

def clean(self):
    if !is_valid_ldap_data(self.cleaned_data.get("fieldname")):
        raise forms.ValidationError("Invalid LDAP data type");
    return self.cleaned_data

或单个字段:

def clean_fieldname(self):
    if !is_valid_ldap_data(self.cleaned_data['fieldname'])):
        raise forms.ValidationError("Invalid LDAP data type");
    return self.cleaned_data['fieldname']

答案 1 :(得分:1)

在您的Form子类中实现自定义字段验证方法

http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute

验证逻辑必须到达它所属的位置。如果form.is_valid() == Trueform.cleaned_data必须有效。仅仅因为代码是这样说的。你想在其他地方隐藏一些验证逻辑 - 这只是不好的做法。

答案 2 :(得分:0)

在我看来,您只需要额外的验证步骤 您可以,具体取决于您的具体需求:

但在每种情况下,如果表单因任何原因(如您的情况)无效,则is_valid应返回False。