首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使Django表单在验证失败后保留文件

如何使Django表单在验证失败后保留文件
EN

Stack Overflow用户
提问于 2010-06-23 07:48:05
回答 3查看 8.2K关注 0票数 25
代码语言:javascript
复制
form = AddItemForm(request.POST, request.FILES)

if form.is_valid()

   do_stuff

return render_to_response(blah.html, {'form':form})

现在,表单将包含错误信息以及字段的原始值,但不保留选定的文件。如果表单未通过验证,如何保留选定的文件?

EN

回答 3

Stack Overflow用户

发布于 2010-09-08 03:50:34

你想做的事情的问题是,出于安全原因,浏览器不允许文件输入框在页面加载时具有预选值。这是正确的,即使它只是简单地保留同一页面的前一个实例的值。Django无法改变这一点。

如果您希望避免要求用户重新选择和重新上载文件,则即使验证失败,也需要保存上载的文件,然后将文件输入字段替换为指示您已经拥有数据的内容。如果用户想放入不同的文件,您可能还需要一个运行某些JavaScript的按钮来重新启用file字段。我认为Django没有提供任何机制来实现这一点,所以你必须自己编写代码。

票数 14
EN

Stack Overflow用户

发布于 2012-08-22 19:08:58

试试django-file-resubmit

内部隔离

代码语言:javascript
复制
pip install django-file-resubmit

settings.py

代码语言:javascript
复制
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')
    },
}

用法

代码语言:javascript
复制
from django.contrib import admin
from file_resubmit.admin import AdminResubmitMixin

class ModelAdmin(AdminResubmitMixin, ModelAdmin):
    pass

代码语言:javascript
复制
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, 
        }
票数 11
EN

Stack Overflow用户

发布于 2010-06-23 08:25:46

如果您使用的是modelForm,并且成功地保存了具有fileField的该模型的新实例,则Django只会将文件单独保存到磁盘上。

在本例中,您需要做的是从request.FILES字典中获取该文件,并自行将其保存到磁盘。它应该看起来像这样。

代码语言:javascript
复制
input_file = request.FILES['fileformfieldname']
new_file = open('/path/to/file.xxx')
new_file.write(input_file.read())

现在您已经将文件保存到磁盘,您只需记住文件的路径,这样当用户重新提交失败的表单时,您就可以再次打开它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3097982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档