django_form 笔记

参考一:https://github.com/rishinkaku/code-snippets/blob/master/django/forms.adoc

参考二: 如下

1.form类的运行顺序是init,clean,validte,save
其中clean和validate会在form.is_valid()方法中被先后调用。(这里留有一个疑问,结构完全相同的两个form,但是一个为先验证后clean,另一个先clean后验证。原因不明。)
这里https://docs.djangoproject.com/en/dev/ref/forms/validation/给的是先验证后clean

2.cleaned_data中的值类型与字段定义的Field类型一致。
如果字段定义charfield,那么clean方法返回的cleaned_data中对应的字段值就是字符型,
定义为ModelChoiceField,则cleaned_data中字段值是某个model实例。
定义为ModelMultipleChoiceField,则cleaned_data中字段值是个model实例list。

post后,form.data可以拿到值

form.is_valid() 或 clean之后,form.cleaned_data里面可以拿到值了。
form.data的值的类型不可以直接保存到model. 而form.cleaned_data可以。
ModelForm中,ModelForm.instance.xxxx =form.cleaned_data['xxxxx']不会报错,用from.data['xxxxx']可能会保错
3.clean等步骤遇到的异常:Exception Value: argument of type 'NoneType' is not iterable. 可能是cleaned_data中某个字段值应该是个列表,实际上却是空值。 4.ModelForm的Meta类中定义的fields 默认的Field是Model中定义的Field,如需更改,可在Form类内以同名字段覆盖,比如自定义widget和required属性等。 不管字段在form中怎么自定义,cleaned_data中对应的值都必须按照model中定义的字段类型取值,否则校验不通过或保存时报错。 暂时记这几条,form还可以重写init、save方法,并且可以自定义方法。如果对这几个东西不懂,想办法找例子读一遍就懂了。 ※※※ clean方法重写时一定不要忘了return cleaned_data ※※※ 补充: 5.form的四种初始化方式 ①ModelForm的实例化:oneform(instanse=onemodel_instance)) ②实例化:oneform(initial={'onefield':value}) ③重写Form类的__init__()方法:self.fields['onefield'].initial = value # 需在super().__init__之后执行,否则会被super().__init__覆盖 ④定义字段时给初始化值:oneformfield = forms.CharField(initial=value) 以上4种方式的优先级:① > ② > ③ > ④ 详细执行顺序可参考源码:django/forms/models.py/BaseModelForm 
原文地址:https://www.cnblogs.com/lxgbky/p/13625702.html