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, а затем безусловно вызываем один из ее методов. Этот вызов не сработает, если переменная не определена.

Вернуться на верх