Django 表单无效时保留上载的文件(文件字段)

Django 表单无效时保留上载的文件(文件字段),django,Django,给定一个模型,该模型具有一个名为number的必填字段和一个名为upload\u file的文件字段: class ExampleModel(models.Model): number = models.IntegerField() upload_file = models.FileField(blank=True, null=True) 在我看来,在POST上,如果表单有效,那么我可以在返回到同一页面时填充文件字段的可清除部分 def example_view(request

给定一个模型,该模型具有一个名为
number
的必填字段和一个名为
upload\u file
的文件字段:

class ExampleModel(models.Model):
    number = models.IntegerField()
    upload_file = models.FileField(blank=True, null=True)
在我看来,在POST上,如果表单
有效
,那么我可以在返回到同一页面时填充文件字段的可清除部分

def example_view(request):
    context = RequestContext(request)
    if request.method == 'POST':
        form = ExampleForm(request.POST, request.FILES)
        if form.is_valid():
            form_instance = form.save()
            form = ExampleForm(instance=form_instance)
            # or alternatively, for just the upload file field
            form = ExampleForm(initial={'upload_file': form_instance.upload_file})
        else:
            form_instance = form.save(commit=False)
            form = ExampleForm(initial={'upload_file': form_instance.upload_file})
            # unfortunately, this also does not work:
            form = ExampleForm(initial={'upload_file': form.fields['upload_file']})
    else:
        form = ExampleForm()
return render_to_response('enterrecords/example.html', {'form': form}, context) 
这就是它的样子:

但是,如果表单无效(请参见第一种情况),我将无法
form.save(commit=False)
,因此无法填充文件字段的可清除部分

form.save(commit=False)
给出以下错误:

ValueError at /en/myapp/example/
The ExampleModel could not be created because the data didn't validate.
这个问题有解决办法吗?

为了完整起见

模型

class ExampleForm(forms.ModelForm):
    class Meta:
        model = ExampleModel
模板

<form enctype="multipart/form-data" method="POST" action="{% url 'eg' %}">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" name="next" value="Next" />Next</button>
</form>

{%csrf_令牌%}
{{form.as_p}}
下一个

使用
表单。清除xxx
,将
xxx
作为要在
表单中清除的字段。它是在调用视图的
是否有效()之前调用的

下面是我在表单中获取Excel文件时所做的示例(我的
UploadedFileHandler
类在这里是无用的,只是为了向您展示原理)

其想法是,即使表单无效,Excel文件始终保存,因此我会跟踪发生的情况:

def clean_excel_file(self):
    uploaded_file = self.files.get('excel_file')
    if uploaded_file:
        try:
            nom = UploadedFileHandler.generate_filename(
                splitext(basename(uploaded_file.name))[1])
            dst = UploadedFileHandler.get_url(nom, 'imports/excel/')

            # sauver le fichier
            dst_full = UploadedFileHandler.full_filename(dst)
            UploadedFileHandler.make_dir(dst_full)
            UploadedFileHandler.save(uploaded_file, dst_full)

            retour = ExcelFile.objects.create(
                # description = nom de fichier sans l'extension :
                description=path.splitext(basename(str(uploaded_file)))[0],
                fichier_origine=uploaded_file,
                excel_file=dst)
            retour.save()
            return retour
        except IOError:
            self.errors['excel_file'] = ErrorList([_("Unknown file type")])
    return None

除非文件字段本身未验证,否则您可以从
form.cleaned\u data
字典中提取正确验证的数据。您不需要创建(未保存的)实例。