python - Django 表单和初始值

标签 python django forms

我追求特定的行为 - 我希望能够保存任何用户在表单运行时输入的值,并在下次运行时使用这些值预先填充表单。我尝试使用初始值来实现此目的,但得到的结果我无法理解,特别是在指定 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/

相关文章:

javascript - 如何防止在html中的数字字段中插入大于最大值的值

Python 包

python - linux mint 中的 PyBluez 安装错误

python - 如何去除标签?

django - 什么是 session ID 以及如何在 Django 中获取它?

javascript - jQuery .clone() 整个 HTML 表单及其所有值

javascript - this.form 和 document.forms 的区别

python - 如何在qt4的文本编辑框中创建多个选择?

python - 字典中最大值的键

django - Gunicorn 没有开始抛出 gunicorn.service : Failed with result 'exit-code' . 错误