给定一个模型称为必填字段number
和ClearableFileInput的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)
它是这样的:
但是,如果表单无效(请参阅第一种情况),则不能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)
使用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)