有相当准确的 关于Django Form validation的文档 (自Django 1.10起) 我已成功使用它了, 那我的问题是什么?
我的问题是记住这些东西。
框架涉及冗余,不规则,一些非显而易见的名称, 当然还有很多幕后自动化 我似乎无法把它放在脑海里。
有人可以帮助描述 扫描速度比原始文档快?
答案 0 :(得分:10)
假设您有一个名为MyForm
的{{3}}班myform
并包含各种Form,特别是a
名为SomeField
的{{1}}字段,我们将其作为示例来理解
到底是怎么回事。
somefield
可以来自Django或您自己的代码。
SomeField
验证过程这些是Django将要进行的验证步骤 执行或尝试:
Form
SomeField.to_python(self, value)
myform
转换为其Python目标类型(例如value
)int
value
强制进入value
SomeField
ValidationError
SomeField.validate(self, value)
myform
value
ValidationError
SomeField.run_validators(self, value)
myform
myform.somefield
value
的所有ValidationError
与验证者合并为一个 ValidationError
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
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_python
(例如通过子类化)SomeField.validate
班级的字段级验证,
你可以实现MyForm
或
只需注册一个验证器:
MyForm.clean_somefield
。
somefield = SomeField(validators=[somevalidator])
作为第一个参数。self
。可以通过各种方式触发此验证过程:
MyForm.clean
myform.full_clean()
myform.is_valid()
等