加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

django 表单验证和字段验证

发布时间:2020-12-15 17:14:50 所属栏目:大数据 来源:网络整理
导读:????表单验证发生在数据验证之后。如果你需要自定义这个过程,有几个不同的地方可以修改,每个地方的目的不一样。表单处理过程中要运行三种类别的验证方法。它们通常在你调用表单的is_valid() 方法时执行。还有其它方法可以触发验证过程(访问errors 属性或

????表单验证发生在数据验证之后。如果你需要自定义这个过程,有几个不同的地方可以修改,每个地方的目的不一样。表单处理过程中要运行三种类别的验证方法。它们通常在你调用表单的is_valid() 方法时执行。还有其它方法可以触发验证过程(访问errors 属性或直接调用full_clean() ),但是通用情况下不需要。

????一般情况下,如果处理的数据有问题,每个类别的验证方法都会引发ValidationError,并将相关信息传递给ValidationError。 参见下文中引发ValidationError 的最佳实践。如果没有引发ValidationError,这些方法应该返回验证后的(规整化的)数据的Python 对象。

????大部分应该可以使用validators 完成,它们可以很容易地重用。Validators 是简单的函数(或可调用对象),它们接收一个参数并对非法的输入抛出ValidationError。 Validators 在字段的to_python 和validate 方法调用之后运行。

????表单的验证划分成几个步骤,它们可以定制或覆盖:

  • 一个字段的to_python() 方法是验证的第一步。它将值强制转换为正确的数据类型,如果不能转换则引发ValidationError。 这个方法从Widget 接收原始的值并返回转换后的值。例如,FloatField 将数据转换为Python 的float 或引发ValidationError。

  • 一个字段的validate() 方法处理字段特异性的验证,这种验证不适合位于validator 中。它接收一个已经转换成正确数据类型的值, 并在发现错误时引发ValidationError。这个方法不返回任何东西且不应该改变任何值。当你遇到不可以或不想放在validator 中的验证逻辑时,应该覆盖它来处理验证。

  • 一个字段的run_validators() 方法运行该字段的所有验证器,并将所有的错误信息汇总为一个ValidationError。你不需要重写这个方法。

  • Field子类的clean() 方法。它负责以正确的顺序运行to_python()validate()?run_validators()?并传播它们的错误。如果任何时刻、任何方法引发ValidationError,验证将停止并引发这个错误。这个方法返回验证后的数据,然后将插入到表单的 cleaned_data 字典中。

  • 表单子类中的clean_<fieldname>() 方法 —— <fieldname> 表单字段属性的名称。这个方法执行特定属性相关的验证,这个验证与字段的类型无关。这个方法没有任何传入的参数。你需要查找self.cleaned_data 中该字段的值,记住此时它已经是一个Python 对象而不是表单中提交的原始字符串(它位于cleaned_data 中是因为字段的clean() 方法已经验证过一次数据)。

    例如,如果你想验证为serialnumber CharField 的内容是否唯一, clean_serialnumber() 将是实现这个功能的正确做法。你需要的不是一个特别的字段(它只是一个CharField),而是一个特定于表单字段特定验证,并且能清理数据。

    这个方法返回值将替换现有值cleaned_data,无论它是否修改过。

  • 表单子类的clean() 方法。这个方法可以实现需要同时访问表单多个字段的验证。这里你可以验证如果提供字段A,那么字段B 必须包含一个合法的邮件地址以及类似的功能。 这个方法可以返回一个完全不同的字典,该字典将用作cleaned_data。

    因为字段的验证方法在调用clean() 时会运行,你还可以访问表单的errors 属性,它包含验证每个字段时的所有错误。

    注意,你覆盖的Form.clean() 引发的任何错误将不会与任何特定的字段关联。它们位于一个特定的“字段”(叫做__all__)中,如果需要可以通过 non_field_errors() 方法访问。如果你想添加一个特定字段的错误到表单中,需要调用 add_error()

    还要注意,覆盖ModelForm 子类的clean() 方法需要特殊的考虑。(更多信息参见ModelForm 文档)。

这些方法按照上面给出的顺序执行,一次验证一个字段。也就是说,对于表单中的每个字段(按它们在表单定义中出现的顺序),先运行Field.clean() ,然后运行clean_<fieldname>()。每个字段的这两个方法都执行完之后,最后运行Form.clean() 方法,无论前面的方法是否抛出过异常。

下面有上面每个方法的示例。

我们已经提到过,所有这些方法都可以抛出ValidationError。对于每个字段,如果Field.clean() 方法抛出 ValidationError,那么将不会调用该字段对应的clean_<fieldname>()方法。 但是,剩余的字段的验证方法仍然会执行。


原文:https://docs.djangoproject.com/en/dev/ref/forms/validation/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读