Django多文件上传报错:No file was submitted. Check the encoding type on the form
问题原因及解决方案
核心原因:表单字段类型不匹配多文件上传需求
你在AddImagesForm中使用forms.FileField处理多文件上传,但FileField仅支持单个文件,无法识别通过multiple属性上传的多文件列表,导致表单验证时判定“未提交文件”。
具体修复步骤
1. 修改表单字段为MultipleFileField
在forms.py中,将image字段替换为支持多文件的MultipleFileField,保留自定义控件:
class AddImagesForm(AddPhotoForm): # 替换FileField为MultipleFileField以支持多文件 image = forms.MultipleFileField(widget=CustomFileInput(attrs={'multiple': True}), required=True) class Meta(AddPhotoForm.Meta): fields = AddPhotoForm.Meta.fields + ['image']
2. 调整视图表单验证逻辑
当前视图先判断文件是否存在再验证表单,会掩盖表单自身的错误信息,调整为优先验证表单:
def post(self, request, *args, **kwargs): form = self.form_class(request.POST, request.FILES, instance=request.user) if form.is_valid(): photos = request.FILES.getlist('image') if photos: galery = form.save() for photo in photos: Image.objects.create(galery=galery, image=photo) return redirect(self.success_url) else: messages.error(request, message='Upload at least one photo!') # 验证失败时返回带错误的表单 return render(request, self.template_name, context={'form': form})
3. 修复Image模型save方法的潜在路径问题
当前save方法直接使用self.image.name打开文件可能引发路径错误,改为通过已保存的文件路径操作:
def save(self, *args, **kwargs): # 先调用父类保存确保文件已写入磁盘 super().save(*args, **kwargs) # 通过文件路径打开并处理图片 img = I.open(self.image.path) img = img.resize(size=(300, 300)) # resize返回新对象,需重新赋值 img.save(self.image.path)
其他确认项
- 你模板中的表单
enctype="multipart/form-data"属性已正确设置,无需修改。 - 检查Django配置中的
MEDIA_ROOT和MEDIA_URL是否正确,确保上传文件能正常存储和访问。
内容的提问来源于stack exchange,提问作者party
相关产品推荐
相关产品推荐

