MultiValueDictKeyError в /"" при загрузке пустого файла
У меня есть приложение django 4, и если пользователь пытается загрузить пустой файл, то возникает такая ошибка:
MultiValueDictKeyError at /controlepunt140
'upload_file'
Я искал эту ошибку. Но похоже, что шаблон правильный. Потому что enctype установлен правильно: enctype="multipart/form-data"
<form
class="form-inline"
action="/controlepunt140"
method="POST"
enctype="multipart/form-data">
<div class="d-grid gap-3">
<div class="form-group">{% csrf_token %} {{form}}
<button type="submit" name="form_pdf" class="btn btn-warning">Upload!</button>
</div>
<div class="form-outline">
<div class="form-group">
<textarea class="inline-txtarea form-control" id="content" cols="70" rows="25">
{{content}}</textarea>
</div>
</div>
</div>
</form>
и views.py:
from __future__ import print_function
import os
from django.conf import settings
from django.shortcuts import render
from django.views import View
from .extracting_text_from_excel import ExtractingTextFromExcel
from .filter_text import FilterText
from .forms import ProfileForm
from .models import UploadFile
def post(self, *args, **kwargs):
filter_text = FilterText()
extract_excel_instance = ExtractingTextFromExcel()
types_of_encoding = ["utf8", "cp1252"]
submitted_form = ProfileForm(self.request.POST, self.request.FILES)
content = ''
content_excel = ''
if self.request.POST.get('form_pdf') is not None:
if submitted_form.is_valid() and self.request.POST:
uploadfile = UploadFile(
image=self.request.FILES["upload_file"])
uploadfile.save()
for encoding_type in types_of_encoding:
with open(os.path.join(settings.MEDIA_ROOT, f"{uploadfile.image}"), 'r', encoding=encoding_type) as f:
if uploadfile.image.path.endswith('.pdf'):
content = filter_text.show_extracted_data_from_file(
uploadfile.image.path)
else:
content = f.read()
return render(self.request, "main/controle_punt140.html", {
'form': ProfileForm(),
"content": content
})
return render(self.request, "main/controle_punt140.html", {
"form": submitted_form,
})
и forms.py:
class ProfileForm(forms.Form):
upload_file = forms.FileField(required=False)
Итак, как с этим бороться?
cf MultiValueDictKeyError in Django
Вы выполняете
uploadfile = UploadFile(
image=self.request.FILES["upload_file"])
Либо используйте try
/ except
, чтобы поймать ошибку,
либо полагаться на .get(): self.request.FILES.get("upload_file", None)
Возможно, вы захотите проверить наличие None
перед вызовом UploadFile()
.
Как написано, это не имеет смысла:
if submitted_form.is_valid() and self.request.POST:
uploadfile = UploadFile(
image=self.request.FILES["upload_file"])
uploadfile.save()
То есть, мы условно определяем переменную uploadfile
,
а затем безусловно вызываем один из ее методов.
Этот вызов не сработает, если переменная не определена.