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
字典中提取正确验证的数据。您不需要创建(未保存的)实例。