Django Form之動態數據初始化

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中獲取,值得注意的是,當希望使用默認值的時候,需要傳入空字典進行數據綁定,否則數據是不會進行綁定的,自然無法驗證。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章