表单无效时保留上载的文件(FileField)

ise*_*rds 5 django

给定一个模型称为必填字段numberClearableFileInput的FileField称为upload_file

class ExampleModel(models.Model):
    number = models.IntegerField()
    upload_file = models.FileField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

在我看来,在POST上,如果是表单,is_valid那么当我返回同一页面时,我可以填充FileField的清除部分。

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) 
Run Code Online (Sandbox Code Playgroud)

它是这样的:

Django的ClearableFileInput

但是,如果表单无效(请参阅第一种情况),则不能form.save(commit=False),因此无法填充FileField的清除部分。

form.save(commit=False)提供了以下错误:

ValueError at /en/myapp/example/
The ExampleModel could not be created because the data didn't validate.
Run Code Online (Sandbox Code Playgroud)

有解决此问题的方法吗?

为了完整性...

型号表格

class ExampleForm(forms.ModelForm):
    class Meta:
        model = ExampleModel
Run Code Online (Sandbox Code Playgroud)

模板

<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>
Run Code Online (Sandbox Code Playgroud)

Oli*_*ons 0

使用form.clean_xxx作为xxx现场清洁您的form。它在调用您的视图之前被调用。is_valid()

这是当我在表单中获取 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
Run Code Online (Sandbox Code Playgroud)