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

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

尝试django-file-resubmit

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)


Apr*_*che 2

如果您使用 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)

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