You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django4上传空文件触发MultiValueDictKeyError错误的解决咨询

解决Django上传空文件触发MultiValueDictKeyError的问题

你遇到的MultiValueDictKeyError是因为当用户未上传任何文件时,request.FILES字典里不存在upload_file键,而代码中直接通过self.request.FILES["upload_file"]强制访问不存在的键,从而触发报错。虽然表单里将upload_file设置为required=False,但这仅表示表单验证允许空值,不会自动给request.FILES添加该键。

具体修复方案

1. 安全获取文件对象

将直接下标访问改为get()方法,当键不存在时返回None,避免报错:

uploaded_file = self.request.FILES.get("upload_file")

2. 调整视图逻辑,增加空文件判断

因为允许空文件上传,需在代码中判断是否有文件上传后,再执行后续的文件读取逻辑,避免空文件导致的后续错误。修改后的views.py代码如下:

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():
            # 安全获取文件,无文件时返回None
            uploaded_file = self.request.FILES.get("upload_file")
            if uploaded_file:
                uploadfile = UploadFile(image=uploaded_file)
                uploadfile.save()

                # 仅当有文件时执行读取逻辑
                for encoding_type in types_of_encoding:
                    try:
                        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()
                        # 编码匹配成功则跳出循环
                        break
                    except UnicodeDecodeError:
                        # 当前编码失败,尝试下一种
                        continue

        return render(self.request, "main/controle_punt140.html", {
            'form': ProfileForm(),
            "content": content
        })

3. 确保模型字段允许为空

检查UploadFile模型的image字段是否设置了blank=True, null=True,保证空文件上传时能正常保存:

class UploadFile(models.Model):
    image = models.FileField(upload_to='uploads/', blank=True, null=True)
    # 其他字段定义...

内容的提问来源于stack exchange,提问作者mightycode Newton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:10:41