Django表格验证概述(快!)

Lut*_*elt 5 python django validation frameworks django-forms

有关于Django Form验证的相当精确的文档 (从Django 1.10开始),我已经成功使用它,所以我的问题是什么?

我的问题是记住这些东西.

该框架涉及冗余,不规则,一些非显而易见的名称,当然还有很多幕后自动化,我似乎无法将其保留在我的脑海中.

有人可以提供比原始文档扫描更快的描述 吗?

Lut*_*elt 10

假设您有一个FormMyForm,myform 其中包含一个名为且包含各种Fields的实例,特别是一个我们用作示例的 SomeField字段somefield来了解正在发生的事情. SomeField可以来自Django或您自己的代码.

Form验证过程

这些是Django将要执行或尝试的验证步骤:

  1. SomeField.to_python(self, value)

    • 呼唤:每个领域 myform
    • 含义:将字符串value转换为其Python目标类型(例如int)
    • 从以下输入: value
    • 返回:value强制进入适当的Python类型SomeField
    • 副作用:应该没有
    • 信号问题:提高 ValidationError
  2. SomeField.validate(self, value)

    • 呼唤:每个领域 myform
    • 含义:在本地验证字段(就像验证器一样)
    • 从以下输入: value
    • 返回:无
    • 副作用:应该没有
    • 信号问题:提高 ValidationError
  3. SomeField.run_validators(self, value)

    • 呼唤:每个领域 myform
    • 含义:执行注册的所有验证器myform.somefield
    • 从以下输入: value
    • 返回:无
    • 副作用:应该没有
    • 通过以下方式发出问题:ValidationErrorValidationError验证器中的所有s 组合成一个
  4. SomeField.clean(self, value)

    • 呼唤:每个领域 myform
    • 意思是:运行to_python,validaterun_validators
    • 从以下输入: value
    • 返回:所需("清理")值,通常是结果 to_python
    • 副作用:Django会将返回值插入 myform.cleaned_data
    • 通过以下方式发出问题:不处理ValidationError其他操作引发的任何问题
    • 注意:不要覆盖.
  5. MyForm.clean_somefield(self)

    • 呼吁:每个Field myform都有这样的方法
    • 含义:somefield在本地验证
    • 从以下输入:( self.cleaned_data现在不再只是字符串!)
    • 返回:新的或未更改的值 somefield
    • 副作用:Django会将返回值插入 myform.cleaned_data
    • 信号问题:提高 ValidationError
    • 注意:这与Field.clean调用在同一循环中发生.
  6. MyForm.clean(self)

    • 要求:myform一次
    • 含义:执行任何跨领域验证
    • 从以下输入:( self.cleaned_data现在不再只是字符串!)
    • 返回:无或将成为一个字典 cleaned_data
    • 副作用:Django会将dict返回值赋给 myform.cleaned_data
    • 电话:通过信号问题self.add_error或提高ValidationError.后者将最终进入myform.non_field_errors().
    • 注意:请注意访问时cleaned_data,因为缺少的字段将丢失.

延伸 ModelForms

ModelForm最后添加了一个步骤的验证:

  1. myform.instance.full_clean():在相应的模型实例(如果有)上调用验证.

并且ModelForm's clean方法还可以通过此instance属性访问模型实例.

自定义验证

为了使myform你想要的验证,你有不同的可能性:

  • SomeField类级别,您可以覆盖 SomeField.to_pythonSomeField.validate(例如通过子类化)
  • 对于类级别的字段级验证MyForm,您可以实现MyForm.clean_somefield或只注册验证器: somefield = SomeField(validators=[somevalidator]).
    • 该验证器可以是标准验证器,也可以是django.core.validators自定义验证器 .
    • 顺便说一句:你可以在你的Form类中放置一个验证器函数; 只是不要添加self作为第一个参数.
  • MyForm级别,您可以实现 MyForm.clean.

触发验证

可以通过各种方式触发此验证过程:

  • 调用 myform.full_clean()
  • 调用 myform.is_valid()
  • 访问myform.errors