Django 休息框架 serializer.errors 使用 multipart/form-data post 请求输出 ["This field is required."]

Django rest framework serializer.errors outputs ["This field is required."] with a multipart/form-data post request

我已经看了一段时间了,我发送了一个带有 multipart/form-data 的 post 请求,但是每个请求都返回了错误 ["This field is required."]我应该用请求填充的字段。

这是序列化程序:

class InvoiceUploadSerializer(serializers.Serializer):
    serial=serializers.CharField(max_length=256, required=True)
    amount=serializers.CharField(max_length=256, required=True)
    debtor=serializers.CharField(max_length=256, required=True)
    dateout=serializers.CharField(max_length=256, required=True)
    expiration=serializers.CharField(max_length=256, required=True)
    invoicefile=serializers.FileField()

    class Meta:
        fields=('serial', 'amount', 'debtor', 'dateout', 'expiration', 'invoicefile',)

和视图:

class InvoiceViewSet(viewsets.ModelViewSet):
    queryset=Invoices.objects.all()
    serializer_class=InvoiceSerializer
    parser_classes=(MultiPartParser, FormParser)

    def get_permissions(self):
        if self.request.method in permissions.SAFE_METHODS:
            return (permissions.AllowAny(),)

        if self.request.method == 'POST':
            return (permissions.IsAuthenticated(),)

        return (permissions.IsAuthenticated(), IsAccountOwner(),)

    def create(self, request):
        serializer=InvoiceUploadSerializer(data=request.data)
        if serializer.is_valid():
            ... handle serializer

            return Response(serializer.validated_data, status=status.HTTP_201_CREATED)
        else:
            emessage=serializer.errors
            return Response({
                'status': 'Bad request',
                'message': emessage,
            }, status=status.HTTP_400_BAD_REQUEST

这是一张显示带有传出请求的浏览器控制台的图片:

最后是来自浏览器控制台的错误消息:

我不明白为什么它告诉我所有字段都丢失了,header 设置正确并且对我来说看起来很好。

切换 view-code 和 urls 仍然是同样的错误,新的同样的问题:

class InvoiceUploadView(APIView):
    parser_classes=(MultiPartParser, FormParser)
    def get_permissions(self):
        return (permissions.AllowAny(),)

    def post(self, request):
        serializer=InvoiceUploadSerializer(data=request.POST)
        if serializer.is_valid():
            return Response(serializer.validated_data, status=status.HTTP_201_CREATED)
        else:
            emessage=serializer.errors
            return Response({
                'status': 'Bad request',
                'message': emessage,
            }, status=status.HTTP_400_BAD_REQUEST)

您的 POST 请求在 Content-Type header 中缺少 multipart boundary。否则,应用程序可能无法解析请求负载 - 并且验证会失败,因为数据会丢失。

浏览器通常会为您设置 Content-Type header 和边界。也许您正在覆盖它并自己在某个地方设置 Content-Type header ?如果是,请取消设置并尝试发出另一个请求。