1. 程式人生 > >django form關於clean及cleaned_data的說明 以及4種初始化

django form關於clean及cleaned_data的說明 以及4種初始化

今天頭針對form裡的幾個方法講了不少東西,頓時茅塞頓開

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屬性字典賦值。