2010-11-24 89 views
1

我有一个django窗体,首先通过调用form.is_valid()验证其数据。如果没有,则重新显示表单,并显示有关无效数据的错误消息。 现在,如果is_valid()为true,我尝试将数据保存在ldap后端。如果form.cleaned_data与ldap数据类型不匹配,我会从我的ldap保存方法中获得一个Exception。现在我想在这种情况下做的是重新显示带有错误信息的表单,就像在form.is_valid()返回false之后发生的事情一样。 我试着阅读一些文档和一些Django源文件,但无法找到我可以在哪里插入。重新显示django窗体成功调用is_valid()后自定义错误消息

另一种方法是仔细构建(自定义)表单字段的形式,以“保证”数据已准备好符合ldap语法。 但我想让shure知道我捕获了ldap语法错误并以便捷的形式显示它们。所以,如果我能够钩入这种形式的重新显示机制会让我成为一个快乐的小程序员:-)

任何想法或提示?

回答

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

在表单子类中实现自定义字段验证方法

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

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

+1

好点。这让我重新思考我的逻辑。因为我实际上没有办法通过ldap检查ldap语法,直到我将其写入ldap。所以我应该执行自定义检查,或者将si_valid_and_successfully_saved()重写为is_valid()。 – Isaac 2010-11-25 11:58:47

0

在我看来,你只是有一个额外的验证步骤。
,你可以根据它们是您的特定需求:

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

+0

我同意。看到我对petraszd答案的评论。 – Isaac 2010-11-25 11:59:35

相关问题