2014-03-18 114 views
1

我正在執行特定的行爲 - 我希望能夠保存任何用戶在運行表單時輸入的值,並在下一次運行表單時使用這些值預填充表單。我嘗試使用初始值來實現此目的,但是我得到的結果我無法理解,特別是在指定FileField或使用FileInput小部件時。Django表單和初始值

查看下面的各種情況以及每個情況下的結果。請注意,我在表單的__init__()中動態地建立了表單字段,但爲了完整起見,場景5查看了通過從視圖中傳遞初始值字典來填充初始值的「常規」方法。因爲在沒有FileInput小部件的情況下使用CharField時,一切都按預期工作,所以我幾乎認爲initial參數在指定文件輸入字段時不起作用。任何時候我使用FileFieldFileInput小部件時,我都會遇到與表單的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 

回答

1

如果您選擇使用filefiled輸入的文件,則瀏覽器使用其內部魔術顯示所選的文件。通過賦予文件字段的價值,你無法實現同樣的目標。您不能更改文件字段值。看到這個:http://www.webdeveloper.com/forum/showthread.php?184694-Can-Javascript-change-value-in-input-type-file-field

此外,當您讓用戶上傳文件時,文件會上傳到內存,然後上載到磁盤,如果這樣做的話。做完這些之後,您可以做的最好的做法是創建虛擬文本框以包含上傳的文件值。但是你不能顯示文件的原始路徑(因爲你無法通過查看服務器端的文件知道它),也不能顯示服務器中文件的完整路徑(不安全)。