Django表格验证概述(快!)

时间:2016-07-15 10:41:00

标签: python django validation frameworks django-forms

有相当准确的 关于Django Form validation的文档 (自Django 1.10起) 我已成功使用它了, 那我的问题是什么?

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

框架涉及冗余,不规则,一些非显而易见的名称, 当然还有很多幕后自动化 我似乎无法把它放在脑海里。

有人可以帮助描述 扫描速度比原始文档快

1 个答案:

答案 0 :(得分:10)

假设您有一个名为MyForm的{​​{3}}班myform 并包含各种Form,特别是a 名为SomeField的{​​{1}}字段,我们将其作为示例来理解 到底是怎么回事。 somefield可以来自Django或您自己的代码。

SomeField验证过程

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

  1. Form

    • 号召:SomeField.to_python(self, value)
    • 的每个字段
    • 含义:将字符串myform转换为其Python目标类型(例如value
    • int
    • 获取输入
    • 返回:value强制进入value
    • 的正确Python类型
    • 副作用:应该没有
    • 通过以下方式发出问题:raise SomeField
  2. ValidationError

    • 号召:SomeField.validate(self, value)
    • 的每个字段
    • 含义:在本地验证字段(就像Fields那样)
    • myform
    • 获取输入
    • 返回:无
    • 副作用:应该没有
    • 通过以下方式发出问题:raise value
  3. ValidationError

    • 号召:SomeField.run_validators(self, value)
    • 的每个字段
    • 含义:执行为myform
    • 注册的所有validator
    • myform.somefield
    • 获取输入
    • 返回:无
    • 副作用:应该没有
    • 通过以下方式表示问题:将value的所有ValidationError与验证者合并为一个
  4. ValidationError

    • 号召:SomeField.clean(self, value)
    • 的每个字段
    • 含义:运行myformto_pythonvalidate
    • run_validators
    • 获取输入
    • 返回:所需(“已清除”)值,通常是value
    • 的结果
    • 副作用:Django会将返回值插入to_python
    • 表示问题:不处理其他操作引发的任何myform.cleaned_data
    • 注意:不要覆盖。
  5. ValidationError

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

    • 呼吁:MyForm.clean(self)一次
    • 含义:执行任何跨领域验证
    • myform获取输入(现在不再只是字符串!)
    • 返回:无或将成为self.cleaned_data
    • 的词典
    • 副作用:Django会将dict返回值分配给cleaned_data
    • 通过以下方式发出问题:致电myform.cleaned_data或提出self.add_error。 后者将以ValidationError结束。
    • 注意:在访问myform.non_field_errors()时请注意,否则请注意 验证将会丢失。
  7. cleaned_data

    的扩展程序

    ModelForms的验证最后还增加了一个步骤:

    1. ModelForm:  在相应的模型实例上调用验证(如果有的话)。
    2. myform.instance.full_clean() ModelForm's方法也有 通过此clean属性访问模型实例。

      自定义验证

      为了使instance能够像你想要的那样进行验证,你就可以了 有不同的可能性:

      • myform班级,您可以覆盖 SomeFieldSomeField.to_python(例如通过子类化)
      • 对于SomeField.validate班级的字段级验证, 你可以实现MyForm或 只需注册一个验证器: MyForm.clean_somefield
        • 该验证器可以是标准的验证器 validators或自定义的。
        • BTW:您可以在Form类中放置验证器功能; 只是不要添加somefield = SomeField(validators=[somevalidator])作为第一个参数。
      • MyForm级别,您可以实施 self

      触发验证

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

      • 致电MyForm.clean
      • 致电myform.full_clean()
      • 访问myform.is_valid()