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

如何在Django Rest Framework中正确获取React前端传来的FormData文件数组

如何在Django Rest Framework中正确获取FormData传递的多文件数组?

你说得没错,问题就出在你访问多文件的方式上。当你通过FormData多次append同一个键名(比如这里的images)时,Django的request.FILES对象并不会自动将这些文件打包成数组——直接用request.FILES['images']只会返回最后一个被append的文件,这也是为什么你尝试循环它时会得到"不可迭代"的错误。

解决方法:使用getlist()方法获取所有文件

要拿到所有上传的图片文件,你需要用request.FILES.getlist('images')来替代直接通过键访问。这个方法会返回对应键名下的所有文件组成的列表,这样你就能正常迭代了。

修改后的后端代码

def create(self, request):
    try:
        productData = json.loads(request.data['product'])
        serializer = ProductSerializer(data=productData)
        if serializer.is_valid():
            product = serializer.save()
            # 关键修改:用getlist获取所有images文件
            files = request.FILES.getlist('images')
            for image in files:
                product_image = {'image': image, 'product': product.id}
                image_serializer = ProductImage(data=product_image)
                if image_serializer.is_valid():
                    image_serializer.save()
                else:
                    raise IntegrityError('Error :' + image_serializer.errors.__str__())
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            raise IntegrityError('Error:' + serializer.errors.__str__())
    except IntegrityError as exc:
        print(exc)
        return Response(str(exc), status=status.HTTP_412_PRECONDITION_FAILED)

额外注意点

  1. 你的前端代码是正确的:多次调用data.append('images', image.arquivo)是传递多文件的标准方式,FormData会保留同一个键的所有值。
  2. 确保你的ProductImage序列化器中的image字段配置正确,要使用serializers.ImageField()来处理文件上传。

内容的提问来源于stack exchange,提问作者Erick Felix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:12:35