重写CreateAPIView的create方法后ImageField值为None的问题
问题:重写CreateAPIView的create方法后ImageField无法获取上传文件
重写CreateAPIView的create方法创建用户时,其他字段都能正常获取值,但profile_picture(ImageField类型)始终返回None,使用默认create方法时一切正常。
原因分析
上传的文件对象并不存储在request.POST中,而是保存在request.FILES里。你之前通过request.POST.get("profile_picture")获取文件,自然拿不到有效数据。
解决方案
Django REST Framework的request.data已经整合了request.POST和request.FILES的内容,直接使用request.data来构建参数即可。修改后的create方法如下:
class VerifyEmail(CreateAPIView): serializer_class = UserSerializer queryset = User.objects.none() def create(self, request, *args, **kwargs): token = request.GET.get("token") invite_info = Invitation.objects.get(new_token=token) # 复制请求数据并补充邀请信息里的固定字段 data = request.data.copy() data.update({ 'email': invite_info.receiver, 'organization': invite_info.organization.pk, 'is_staff': request.GET.get('is_staff', False), 'is_superuser': request.GET.get('is_superuser', False), }) serializer = self.get_serializer(data=data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=201, headers=headers)
补充说明
request.data会自动处理multipart/form-data类型的请求,包含所有表单数据和上传的文件对象- 使用
request.data.copy()是为了避免直接修改原始请求数据对象 - 通过
update方法补充邀请信息中的固定字段,无需手动逐个提取前端传入的参数
内容的提问来源于stack exchange,提问作者Davit Sahakyan
相关产品推荐
相关产品推荐

