Django表单和初始值
我想实现一个特定的功能——当用户填写表单时,能够保存他们输入的值,并在下次打开表单时自动填入这些值。我尝试使用初始值来实现这个功能,但结果让我感到困惑,特别是在使用FileField
或者FileInput
小部件时。
下面是我遇到的各种情况以及每种情况的结果。请注意,我是在表单的__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
1 个回答
如果你通过文件输入框选择一个文件,浏览器会用它的“魔法”显示你选择的文件。你不能通过直接给文件输入框赋值来实现同样的效果。也就是说,你不能改变文件输入框的值。你可以看看这个链接了解更多:http://www.webdeveloper.com/forum/showthread.php?184694-Can-Javascript-change-value-in-input-type-file-field。
而且,当你让用户上传文件时,文件会先被上传到内存中,然后再存到硬盘上(如果你选择这样做的话)。在这个过程中,你能做的最好的事情就是创建一个虚拟的文本框来显示上传的文件值。但是你不能显示文件的原始路径(因为在服务器端你无法通过查看文件来知道这个路径),也不能显示文件在服务器上的完整路径(这不安全)。