2016-07-15 67 views
2

有相当精确的 文档中关于Django Form validation (如Django的1.10) 和我已经用它已经成功, 那么什么是我的问题吗?Django表单验证如何工作?

我的问题是记住这个东西。

该框架包括冗余,不规则,一些不常见的名字, 当然还有很多幕后的的自动机制 ,我似乎不能够保持它在我的头上。

有人可以帮忙的描述是 比原始文档更快的扫描

回答

4

假设你有一个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
    • 含义每个字段:验证字段局部(就像一个validator会)
    • 需要输入从:value
    • 返回:无
    • 副作用:应具有无
    • 信号提高ValidationError
  3. SomeField.run_validators(self, value)

    :通过问题
    • 呼吁:的myform
    • 含义每场:执行所有validators注册myform.somefield
    • 需要输入来自:value
    • 回报:无
    • 副作用:应该没有
    • 信号问题通过:raise ValidationError将来自验证器的所有ValidationError合并为一个
  4. SomeField.clean(self, value)

    • 呼吁:的myform
    • 含义每个字段:运行to_pythonvalidate,和run_validators
    • 需要从输入:value
    • 返回:所需的( “清洁” )值,通常结果为to_python
    • 方效果:不处理被其他操作
    • 说明中提出的任何ValidationError:不重写Django会被插入的返回值到myform.cleaned_data
    • 信号问题。
  5. MyForm.clean_somefield(self)

    • 呼吁:的myform每场的这种方法
    • 含义:验证somefield本地
    • 需要输入来自:(!现在已经不再只是字符串)self.cleaned_data
    • 返回:somefield的新值或未更改值
    • 副作用:Django会被插入的返回值到myform.cleaned_data
    • 信号问题:提高ValidationError
    • 注:这发生在同一个环路Field.clean电话。
  6. MyForm.clean(self)

    • 呼吁:myform一次
    • 含义:执行任何交叉域验证
    • 需要从输入:(!现在已经不再只是字符串)self.cleaned_data
    • 回报:无或一个字典,将成为cleaned_data
    • 副作用: Django会通过一个字典返回值赋给myform.cleaned_data
    • 信号问题:调用self.add_error或提高ValidationError。 后者将在myform.non_field_errors()结束。
    • 注:谨防访问cleaned_data的时候,因为这没有 验证将丢失的字段。

扩展的ModelForm用于ModelForms

验证已多一个步骤中加入底:

  • myform.instance.full_clean(): 调用验证在相应的模型实例(如果有的话)。
  • 而一个ModelForm'sclean方法也将通过这个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