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。
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的四種初始化方式
①實例化oneform(initial={'onefield':value})
②定義字段時給初始化值oneformfield = forms.CharField(initial=value)
③重寫Form類的__init__()方法:self.fields['onefield'].initial = value
④當給form傳參instanse(即oneform(instanse=onemodel_instance))時,前三種初始化方法會全部失效,即使重寫__init__時,先調用父類的__init__再使用方法③,仍然無效(不是很爽)。
這時想重新初始化字段值只能在__init__()里 self.initial['title'] = value,直接對Form類的initial屬性字典賦值。
原文章地址:https://www.douban.com/note/296298497/