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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:34:58