form = AddItemForm(request.POST, request.FILES)
if form.is_valid()
do_stuff
return render_to_response(blah.html, {'form':form})
现在,表单将包含错误信息以及字段的原始值,但不保留选定的文件。如果表单未通过验证,如何保留选定的文件?
发布于 2010-09-08 03:50:34
你想做的事情的问题是,出于安全原因,浏览器不允许文件输入框在页面加载时具有预选值。这是正确的,即使它只是简单地保留同一页面的前一个实例的值。Django无法改变这一点。
如果您希望避免要求用户重新选择和重新上载文件,则即使验证失败,也需要保存上载的文件,然后将文件输入字段替换为指示您已经拥有数据的内容。如果用户想放入不同的文件,您可能还需要一个运行某些JavaScript的按钮来重新启用file字段。我认为Django没有提供任何机制来实现这一点,所以你必须自己编写代码。
发布于 2012-08-22 19:08:58
内部隔离
pip install django-file-resubmit
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')
},
}
用法
from django.contrib import admin
from file_resubmit.admin import AdminResubmitMixin
class ModelAdmin(AdminResubmitMixin, ModelAdmin):
pass
或
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,
}
发布于 2010-06-23 08:25:46
如果您使用的是modelForm,并且成功地保存了具有fileField的该模型的新实例,则Django只会将文件单独保存到磁盘上。
在本例中,您需要做的是从request.FILES字典中获取该文件,并自行将其保存到磁盘。它应该看起来像这样。
input_file = request.FILES['fileformfieldname']
new_file = open('/path/to/file.xxx')
new_file.write(input_file.read())
现在您已经将文件保存到磁盘,您只需记住文件的路径,这样当用户重新提交失败的表单时,您就可以再次打开它。
https://stackoverflow.com/questions/3097982
复制相似问题