有相当精确的
有关Django Form validation的文档
而且我已经成功使用了它,
那我怎么了
我的问题是记住这些东西。
该框架涉及冗余,不规则,一些不明显的名称,
当然还有很多幕后的魔术
而且我似乎无法记住它。
有人可以帮忙提供以下说明吗?
的扫描速度比原始文档快吗?
最佳答案
假设您有一个Form类MyForm
,其实例名为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
的每个字段value
ValidationError
SomeField.run_validators(self, value)
myform
的每个字段myform.somefield
注册的所有validators 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])
。django.core.validators
或自定义的。 只需避免将
self
添加为第一个参数。 MyForm.clean
。 触发验证
可以通过多种方式触发此验证过程:
myform.full_clean()
myform.is_valid()
myform.errors
等。关于python - Django表单验证概述(快速!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38394078/