python - Django表单验证概述(快速!)

标签 python django validation frameworks django-forms

有相当精确的
有关Django Form validation的文档
而且我已经成功使用了它,
那我怎么了
我的问题是记住这些东西。
该框架涉及冗余,不规则,一些不明显的名称,
当然还有很多幕后的魔术
而且我似乎无法记住它。
有人可以帮忙提供以下说明吗?
的扫描速度比原始文档快吗?

最佳答案

假设您有一个FormMyForm,其实例名为myform并包含各种Fields,尤其是a
我们以SomeField字段somefield为例来了解
到底是怎么回事。SomeField可以来自Django或您自己的代码。
Form验证过程

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

  • SomeField.to_python(self, value)
  • 要求:myform的每个字段
  • 含义:将字符串value转换为其Python目标类型(例如int)
  • 从以下来源获取输入:value
  • 返回:value强制转换为SomeField的正确Python类型
  • 副作用:应该没有
  • 通过以下方式发出问题信号:提高ValidationError
  • SomeField.validate(self, value)
  • 要求:myform的每个字段
  • 含义:在本地验证Field(就像validator一样)
  • 从以下来源获取输入:value
  • 返回:无
  • 副作用:应该没有
  • 通过以下方式发出问题信号:提高ValidationError
  • SomeField.run_validators(self, value)
  • 要求:myform的每个字段
  • 含义:执行为myform.somefield注册的所有validators
  • 从以下来源获取输入:value
  • 返回:无
  • 副作用:应该没有
  • 通过以下方式发出问题信号:提高ValidationError,将验证器中的所有ValidationError组合成一个
  • SomeField.clean(self, value)
  • 要求:myform的每个字段
  • 含义:运行to_pythonvalidaterun_validators
  • 从以下来源获取输入:value
  • 返回:所需的(“清除的”)值,通常是to_python的结果
  • 副作用:Django会将返回值插入myform.cleaned_data
  • 通过以下方式发出问题信号:不处理其他操作
  • 引发的任何ValidationError
  • 注意:请勿覆盖。
  • MyForm.clean_somefield(self)
  • 要求:带有这种方法
  • myform的每个字段
  • 含义:在本地验证somefield
  • 从以下位置获取输入:self.cleaned_data(现在不再只是字符串!)
  • 返回:somefield的新值或不变值
  • 副作用:Django会将返回值插入myform.cleaned_data
  • 通过以下方式发出问题信号:提高ValidationError
  • 注意:这与Field.clean调用在同一循环中发生。
  • 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的验证又增加了一个步骤:
  • 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等。
  • 关于python - Django表单验证概述(快速!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38394078/

    相关文章:

    python - Sklearn 聚类相似订单

    Django外键表单保存

    validation - Identity Server 3 访问 token 验证端点失败,受众验证失败

    ruby-on-rails - 使用 Devise 添加 TOS 协议(protocol)复选框

    .net - asp.net mvc 3 是否有自动服务器端验证?

    python - 使用列表理解填充 pandas 值字典

    python - Numpy:沿轴应用返回错误:使用序列设置数组元素

    python - 在 Dask 中高效删除行

    python - 如何在 Django 中按日期对对象进行分组?

    django - "startproject"选项从 django-admin.py 中消失