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
相关产品推荐
相关产品推荐

