Django中使用HttpResponseRedirect传递Serializer数据报错的解决办法
问题解决办法
首先,你报错的核心原因是reverse函数的参数使用错误:
serializer.data是ReturnDict类型的字典,而reverse的位置参数要求是可哈希的类型(如字符串、整数),字典属于不可哈希类型,因此抛出unhashable type: 'ReturnDict'错误。- 你把
status参数传给了reverse,但这个参数应该是HttpResponseRedirect的构造参数,不属于reverse的参数范围。
修正代码的两种场景:
场景1:跳转的login路由不需要额外参数
直接移除多余参数,正确写法如下:
class LoginAPIView(generics.GenericAPIView): serializer_class = LoginSerializer def post(self, request): serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) return HttpResponseRedirect(reverse('login'), status=status.HTTP_200_OK)
场景2:跳转的login路由需要传递参数
如果你的login路由定义了必填参数(比如token),需要从serializer.data中提取具体键值对,以kwargs形式传给reverse:
class LoginAPIView(generics.GenericAPIView): serializer_class = LoginSerializer def post(self, request): serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) # 根据你的实际路由参数调整键名,这里以token为例 redirect_url = reverse('login', kwargs={'token': serializer.data.get('token')}) return HttpResponseRedirect(redirect_url, status=status.HTTP_200_OK)
额外补充:如果是RESTful API接口,通常更推荐返回Response配合前端处理跳转,HttpResponseRedirect更适配传统Django视图而非DRF的APIView。如果是为了防止重复提交,也可以考虑前端层面做按钮置灰、防抖,或者后端实现幂等性校验。
内容的提问来源于stack exchange,提问作者Random User
相关产品推荐
相关产品推荐

