【问题标题】:Django Form validation overview (quick!)Django 表单验证概述(快速!)
【发布时间】:2016-11-18 13:03:26
【问题描述】:

有相当精确的 关于Django Form validation 的文档 而且我已经成功使用了, 那我的问题是什么?

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

该框架涉及冗余,不规则,一些不明显的名称, 当然还有很多幕后魔术 而且我似乎无法记住它。

谁能帮忙描述一下 扫描速度比原始文档快

【问题讨论】:

    标签: python django validation frameworks django-forms


    【解决方案1】:

    假设您有一个 FormMyForm 和一个名为 myform 的实例 并包含各种Fields,尤其是 SomeField 字段名为 somefield,我们以该字段为例进行理解 到底是怎么回事。 SomeField 可以来自 Django 或您自己的代码。

    Form 验证过程

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

    1. SomeField.to_python(self, value)

      • 要求:myform 的每个字段
      • 含义:将字符串value转换为其Python目标类型(例如int
      • 输入来自:value
      • 返回:value 强制转换为 SomeField 的正确 Python 类型
      • 副作用:应该没有
      • 信号问题:raise ValidationError
    2. SomeField.validate(self, value)

      • 要求:myform 的每个字段
      • 含义:在本地验证字段(就像 validator 一样)
      • 输入来自:value
      • 返回:无
      • 副作用:应该没有
      • 信号问题:raise ValidationError
    3. SomeField.run_validators(self, value)

      • 要求:myform 的每个字段
      • 含义:执行所有为myform.somefield注册的validators
      • 输入来自:value
      • 返回:无
      • 副作用:应该没有
      • 通过以下方式发出问题信号:raise ValidationError 将验证器中的所有 ValidationErrors 合并为一个
    4. SomeField.clean(self, value)

      • 要求:myform 的每个字段
      • 含义:运行to_pythonvalidaterun_validators
      • 输入来自:value
      • 返回:所需的(“清理”)值,通常是to_python 的结果
      • 副作用:Django 会将返回值插入myform.cleaned_data
      • 信号问题:未处理其他操作引发的任何ValidationError
      • 注意:不要覆盖。
    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 获取输入(现在不再只是字符串!)
      • 返回:None 或将变为 cleaned_data 的 dict
      • 副作用:Django 会将一个dict返回值分配给myform.cleaned_data
      • 通过以下方式发出问题信号:调用self.add_error 或提高ValidationError。 后者最终会出现在myform.non_field_errors()
      • 注意:访问cleaned_data 时要小心,因为字段没有 validate 将丢失。

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 2016-05-06
      • 2011-03-10
      • 2011-01-19
      相关资源
      最近更新 更多