【问题标题】:redisplay django form after successfull call to is_valid() with custom error message使用自定义错误消息成功调用 is_valid() 后重新显示 django 表单
【发布时间】:2011-05-15 06:04:25
【问题描述】:

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

另一种方法是仔细构建(自定义)表单字段的表单,以“保证”数据完全符合 ldap 语法。 但我想确保我捕获 ldap 语法错误并以方便的形式显示它们。所以,如果我能加入那个表单重新显示机制,我就会成为一个快乐的小程序员 :-)

有什么想法或提示吗?

【问题讨论】:

    标签: django validation


    【解决方案1】:

    在扩展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']
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 好点。这让我重新思考我的逻辑。因为我真的没有办法通过 ldap 检查 ldap 语法,直到我真正将它写入 ldap。所以我应该进行自定义检查,或者将 is_valid() 重写为 si_valid_and_successfully_saved() 之类的东西。
      【解决方案3】:

      在我看来,您只是多了一个验证步骤。
      您可以,具体取决于您的具体需求:

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

      【讨论】:

      • 我同意。请参阅我对 petraszd 答案的评论。
      猜你喜欢
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      相关资源
      最近更新 更多