我正在執行特定的行爲 - 我希望能夠保存任何用戶在運行表單時輸入的值,並在下一次運行表單時使用這些值預填充表單。我嘗試使用初始值來實現此目的,但是我得到的結果我無法理解,特別是在指定FileField
或使用FileInput
小部件時。Django表單和初始值
查看下面的各種情況以及每個情況下的結果。請注意,我在表單的__init__()
中動態地建立了表單字段,但爲了完整起見,場景5查看了通過從視圖中傳遞初始值字典來填充初始值的「常規」方法。因爲在沒有FileInput
小部件的情況下使用CharField
時,一切都按預期工作,所以我幾乎認爲initial
參數在指定文件輸入字段時不起作用。任何時候我使用FileField
或FileInput
小部件時,我都會遇到與表單的is_valid()
方法不一致的行爲。
我已經閱讀了Django文檔的重新表單字段,初始值,綁定和非綁定表單以及表單驗證,我仍然無法理解爲什麼我會得到下面顯示的結果。
任何幫助理解這一點,或建議更好的方式來完成我想要做的是非常感謝。
# Scenario 1
self.fields['file_name'] = forms.CharField(required=True, label='File to import',
initial='F:/Repository/file_name.csv')
# Result: Initial value appears on form
# Without modifying the value displayed, form.is_valid() returns True
# Removing the value displayed (blanking the field) form.is_valid() returns False
# Scenario 2
self.fields['file_name'] = forms.FileField(required=True, label='File to import',
initial='F:/Repository/file_name.csv')
# Result: Initial value does NOT appear on the form
# Without entering a value, form.is_valid() returns True
# Scenario 3
self.fields['file_name'] = forms.CharField(required=True, label='File to import',
initial='F:/Repository/file_name.csv', widget=forms.FileInput)
# Result: Initial value does NOT appear on the form
# Without entering a value, form.is_valid() returns False
# Using the FileInput widget to select a file, form.is_valid() still returns False
# Scenario 4
self.fields['file_name'] = forms.FileField(required=True, label='File to import',
initial='F:/Repository/file_name.csv', widget=forms.FileInput)
# Result: Initial value does NOT appear on the form
# Without selecting a file, form.is_valid() returns True
# Selecting a file, form.is_valid() returns True
# Scenario 5
self.fields['file_name'] = forms.FileField(required=True, label='File to import',
widget=forms.FileInput)
# initial = {'file_name': 'F:/Repository/file_name.csv'} passed as an
# argument to the form
# Without entering a value, form.is_valid() returns False
# Using the FileInput widget to select a file, form.is_valid() still returns False