【问题标题】:Django forms and initial valuesDjango 表单和初始值
【发布时间】: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

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    如果您使用 filefiled 输入选择一个文件,那么浏览器会使用其内在的魔力显示被选择的文件。通过赋予文件字段价值,您无法实现相同的目标。您不能更改文件字段值。看到这个:http://www.webdeveloper.com/forum/showthread.php?184694-Can-Javascript-change-value-in-input-type-file-field。

    此外,当您让用户上传文件时,如果您这样做,文件会上传到内存,然后再上传到磁盘。之后,您可以做的最好的事情是创建虚拟文本字段以包含上传的文件值。但是您既不能显示文件的原始路径(因为您无法通过查看服务器端的文件来知道它),也不能显示服务器中文件的完整路径(不安全)。

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多