我已经关注这个问题有一段时间了,我发送了一个带有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
以下图片显示了带有传出请求的浏览器控制台:
最后是来自浏览器控制台的错误消息:
我不明白为什么它会告诉我所有的字段都丢失了,标题设置正确,而且在我看来还不错。
切换视图代码和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)
发布于 2018-05-31 18:14:00
您的POST请求的Content-Type
标头中缺少multipart boundary。否则,应用程序可能无法解析请求负载,并且验证将失败,因为数据将丢失。
浏览器通常会为您设置Content-Type
标头和边界。也许您正在覆盖它,并自己在某个地方设置Content-Type
头?如果是,请取消设置,然后尝试发出另一个请求。
https://stackoverflow.com/questions/50573822
复制相似问题