Django REST Framework multipart/form-data请求返回所有字段必填错误
Hey,我看了你折腾好久的这个问题——发送multipart/form-data格式的POST请求后,所有该填充的字段都返回["This field is required."],换了视图和URL也没解决,咱们来拆解一下问题根源:
你已经给出了序列化器、原ViewSet、新APIView的代码,还有请求和错误的截图(从截图来看,前端确实发送了正确的multipart/form-data请求,包含了所有必填字段和文件),但后端就是识别不到这些字段。
问题出在这两个关键点上:
1. 新APIView里错误用了request.POST而非request.data
在你的InvoiceUploadView的post方法里,你写了:
serializer=InvoiceUploadSerializer(data=request.POST)
这是踩了DRF的一个常见坑!对于multipart/form-data这类包含文件的请求,DRF会把解析后的所有表单数据(包括文件)都放到request.data里,而request.POST只能获取到非文件的表单字段,而且在DRF的视图逻辑里,官方推荐统一用request.data来处理所有请求类型的参数(不管是form-data、json还是其他格式)。
把这行改成:
serializer=InvoiceUploadSerializer(data=request.data)
2. 原ViewSet存在序列化器配置冲突
在你最初的InvoiceViewSet里,你设置了serializer_class=InvoiceSerializer,但在create方法里却手动用了InvoiceUploadSerializer。虽然你在create里指定了序列化器,但这种配置不一致可能引发隐性的解析问题。建议要么把ViewSet的serializer_class改成InvoiceUploadSerializer,要么确保在create方法里完全独立处理序列化逻辑,避免冲突。
额外的排查建议
- 核对字段名一致性:再仔细检查前端发送的表单字段名和序列化器里的
serial、amount、debtor等是否完全一致(大小写、拼写都不能错),从你的请求截图看是匹配的,但再确认一遍没坏处。 - 打印请求数据排查:修改视图代码,先打印
request.data看看DRF实际解析到了什么内容:
def post(self, request): print("Parsed request data:", request.data) serializer=InvoiceUploadSerializer(data=request.data) # ... 后续逻辑
如果打印出来是空的,那可能是解析器配置有问题,但你已经配置了MultiPartParser和FormParser,这部分应该没问题;如果能看到字段,那说明序列化器就能正确识别了。
总结
最关键的修复就是把request.POST换成request.data,这应该能解决你所有字段缺失的问题。如果还是不行,再通过打印request.data来进一步定位!
内容的提问来源于stack exchange,提问作者Marcus Grass

