我追求特定的行为 - 我希望能够保存任何用户在表单运行时输入的值,并在下次运行时使用这些值预先填充表单。我尝试使用初始值来实现此目的,但得到的结果我无法理解,特别是在指定 FileField
时或者当使用FileInput
时小部件。
查看下面的各种场景以及我在每个场景中得到的结果。请注意,我正在 __init__()
中动态建立表单字段。但为了完整起见,场景 5 着眼于通过从 View 传递初始值字典来填充初始值的“传统”方法。因为使用 CharField
时一切都会按预期工作。没有FileInput
小部件,我几乎认为 initial
指定文件输入字段时参数不起作用。我的行为与表单的 is_valid()
不一致任何时候我使用 FileField
的方法或FileInput
小部件。
我已经阅读了有关表单字段、初始值、绑定(bind)和非绑定(bind)表单以及表单验证的 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
最佳答案
如果您使用文件输入选择一个文件,那么浏览器将利用其内在的魔力显示所选择的文件。通过为文件字段赋予值,您无法实现同样的目标。您无法更改文件字段值。看到这个:http://www.webdeveloper.com/forum/showthread.php?184694-Can-Javascript-change-value-in-input-type-file-field .
此外,当您让用户上传文件时,如果您这样做,文件将被上传到内存,然后再上传到磁盘。完成此操作后,您能做的最好的事情就是创建虚拟文本字段来包含上传的文件值。但是您既不能显示文件的原始路径(因为您无法通过查看服务器端的文件来知道它),也不能显示文件在服务器中的完整路径(不安全)。
关于python - Django 表单和初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22490399/