【发布时间】:2016-11-18 13:03:26
【问题描述】:
有相当精确的 关于Django Form validation 的文档 而且我已经成功使用了, 那我的问题是什么?
我的问题是记住这些东西。
该框架涉及冗余,不规则,一些不明显的名称, 当然还有很多幕后魔术 而且我似乎无法记住它。
谁能帮忙描述一下 扫描速度比原始文档快?
【问题讨论】:
标签: python django validation frameworks django-forms
有相当精确的 关于Django Form validation 的文档 而且我已经成功使用了, 那我的问题是什么?
我的问题是记住这些东西。
该框架涉及冗余,不规则,一些不明显的名称, 当然还有很多幕后魔术 而且我似乎无法记住它。
谁能帮忙描述一下 扫描速度比原始文档快?
【问题讨论】:
标签: python django validation frameworks django-forms
假设您有一个 Form 类 MyForm 和一个名为 myform 的实例
并包含各种Fields,尤其是
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 的每个字段
value
ValidationError
SomeField.run_validators(self, value)
myform 的每个字段
myform.somefield注册的validators
value
ValidationError 将验证器中的所有 ValidationErrors 合并为一个SomeField.clean(self, value)
myform 的每个字段
to_python、validate和run_validators
value
to_python 的结果
myform.cleaned_data
ValidationError
MyForm.clean_somefield(self)
myform 的每个字段都有这样的方法somefield
self.cleaned_data 获取输入(现在不再只是字符串!)somefield 的新值或未更改值
myform.cleaned_data
ValidationError
Field.clean 调用相同的循环中。MyForm.clean(self)
myform 一次self.cleaned_data 获取输入(现在不再只是字符串!)cleaned_data 的 dict myform.cleaned_data
self.add_error 或提高ValidationError。
后者最终会出现在myform.non_field_errors()。cleaned_data 时要小心,因为字段没有
validate 将丢失。ModelForms 的扩展名
ModelForm 的验证在最后增加了一个步骤:
myform.instance.full_clean():
在相应的模型实例(如果有)上调用验证。还有一个ModelForm's clean 方法也会有
通过instance 属性访问模型实例。
为了让myform 像你想要的那样验证,你因此
有不同的可能性:
SomeField 类级别,您可以覆盖
SomeField.to_python 或 SomeField.validate(例如通过子类化)MyForm 类级别的字段级别验证,
你可以实现MyForm.clean_somefield 或
只需注册一个验证器:
somefield = SomeField(validators=[somevalidator])。
django.core.validators 或自定义的。self 添加为第一个参数。MyForm.clean。可以通过多种方式触发此验证过程:
myform.full_clean()
myform.is_valid()
myform.errors等【讨论】: