代码之家  ›  专栏  ›  技术社区  ›  Marcus Grass

django rest framework serializer.errors通过多部分/表单数据发布请求输出[“此字段是必需的。”]

  •  1
  • Marcus Grass  · 技术社区  · 6 年前

    我已经看了一段时间了,我正在发送一个包含多部分/表单数据的POST请求,但是返回错误[“此字段是必需的。”]对于我应该用请求填充的每个字段。

    这是序列化程序:

    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
    

    这是一张显示浏览器控制台和传出请求的图片: enter image description here

    最后,来自浏览器控制台的错误消息: enter image description here

    我不明白为什么它告诉我所有字段都丢失了,标题设置正确,我觉得它很好。

    切换了视图代码和URL,仍然有相同的错误,新的有相同的问题:

    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)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Will Keeling    6 年前

    您的邮件请求缺少 multipart boundary 在它里面 Content-Type 标题。如果没有这一点,应用程序可能无法解析请求负载——验证将失败,因为数据将丢失。

    浏览器通常会设置 内容类型 标题和边界。也许你是在超越这一点 内容类型 把你自己找个地方?如果是,请取消设置并尝试提出另一个请求。