Form.initial != 動態數據初始化
在上一篇對BaseForm的源碼分析中,我們已經可以清晰地知道Form.initial並沒有對數據初始化,它只是對沒有綁定的表單進行展示。
接下來我將提供一個簡短的代碼片段及示例來描述如何動態初始化,假設有一個QueryForm,有兩個參數進行查詢,分別是limit和offset,通過這兩個參數來控制分頁,limit的默認值爲10,offset默認爲0。
class QueryForm(forms.Form):
limit = forms.IntegerField(required=False)
offset = forms.IntegerField(required=False)
我們想要達到這樣的效果:
>>> f1 = QueryForm({})
>>> f1.is_valid()
True
>>> f1.cleaned_data
{'limit': 10, 'offset': 0}
現在是對field進行默認的賦值,而不是底層的驗證,因此我不會選擇在field層次進行initial的賦值,我選擇在form.clean_<field_name>。
def clean_limit(self):
limit = self.cleaned_data.get('limit', None)
if limit is None:
return self.initial.get('limit', DEFAULT_LIMIT)
return limit
offset同理:
def clean_offset(self):
offset = self.cleaned_data.get('offset', None)
if offset is None:
return self.initial.get('offset', DEFAULT_OFFSET)
return offset
如果我們在data中提供對limit和offset的定義,也能在cleaned_data中獲取,值得注意的是,當希望使用默認值的時候,需要傳入空字典進行數據綁定,否則數據是不會進行綁定的,自然無法驗證。