gpt4 book ai didi

django - 表单无效时保留上传的文件(FileField)

转载 作者:行者123 更新时间:2023-12-03 17:41:51 26 4
gpt4 key购买 nike

给定一个带有名为 number 的必填字段的模型和一个 ClearableFileInput FileField 调用 upload_file :

class ExampleModel(models.Model):
number = models.IntegerField()
upload_file = models.FileField(blank=True, null=True)

在我看来,在 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)

这是它的外观:

Django ClearableFileInput

但是,如果表单无效(请参阅第一个 else 情况),我不能 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.

这个问题有解决方法吗?

为了完整性...

模型表格
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>

最佳答案

使用 form.clean_xxxxxx成为您的清洁领域 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

关于django - 表单无效时保留上传的文件(FileField),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34320479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com