Ste*_*eve 21 django django-forms
form = AddItemForm(request.POST, request.FILES)
if form.is_valid()
do_stuff
return render_to_response(blah.html, {'form':form})
Run Code Online (Sandbox Code Playgroud)
现在表单将包含错误信息以及字段的原始值,但它不会保留选定的文件如果表单验证失败,如何保留选定的文件?
Wal*_*ndt 10
您想要做的问题是,出于安全原因,浏览器不允许文件输入框在页面加载时具有预先选择的值.即使它只是保留同一页面的前一个实例的值,也是如此.Django无法改变这一点.
如果您想避免要求用户重新选择并重新上传文件,即使验证失败,您也需要保存上传的文件,然后将文件输入字段替换为表示您已有数据的内容.如果用户想要放入不同的文件,您可能还需要一个运行某些JavaScript的按钮来重新启用文件字段.我不认为Django会为此提供任何机器,因此您必须自己编写代码.
un1*_*n1t 10
insallation
pip install django-file-resubmit
Run Code Online (Sandbox Code Playgroud)
settings.py
INSTALLED_APPS = {
...
'sorl.thumbnail',
'file_resubmit',
...
}
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
},
"file_resubmit": {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
"LOCATION": project_path('data/cache/file_resubmit')
},
}
Run Code Online (Sandbox Code Playgroud)
用法
from django.contrib import admin
from file_resubmit.admin import AdminResubmitMixin
class ModelAdmin(AdminResubmitMixin, ModelAdmin):
pass
Run Code Online (Sandbox Code Playgroud)
要么
from django.forms import ModelForm
from file_resubmit.admin import AdminResubmitImageWidget, AdminResubmitFileWidget
class MyModelForm(forms.ModelForm)
class Meta:
model = MyModel
widgets = {
'picture': AdminResubmitImageWidget,
'file': AdminResubmitFileWidget,
}
Run Code Online (Sandbox Code Playgroud)
如果您使用 modelForm 并且成功保存具有 fileField 的该模型的新实例,Django 只会将文件保存到磁盘。
在您的情况下,您要做的就是从 request.FILES 字典中获取文件,并将其保存到您自己的磁盘上。它应该看起来像这样。
input_file = request.FILES['fileformfieldname']
new_file = open('/path/to/file.xxx')
new_file.write(input_file.read())
Run Code Online (Sandbox Code Playgroud)
现在您已将文件保存到磁盘,您只需记住该文件的路径,以便当用户重新提交失败的表单时可以再次打开它。
| 归档时间: |
|
| 查看次数: |
6722 次 |
| 最近记录: |