【发布时间】:2014-03-18 20:32:02
【问题描述】:
我追求特定行为 - 我希望能够保存任何用户在运行表单时输入的值,并在下次运行时使用这些值预填充表单。我尝试使用初始值来实现这一点,但我得到了我无法理解的结果,特别是在指定FileField 或使用FileInput 小部件时。
请参阅下面的各种场景以及我在每种情况下得到的结果。请注意,我在表单的__init__() 中动态建立表单字段,但为了完整起见,场景 5 着眼于通过从视图传递初始值 dict 来填充初始值的“常规”方法。因为在使用没有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
【问题讨论】: