You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中使用HttpResponseRedirect传递Serializer数据报错的解决办法

问题解决办法

首先,你报错的核心原因是reverse函数的参数使用错误:

  1. serializer.data是ReturnDict类型的字典,而reverse的位置参数要求是可哈希的类型(如字符串、整数),字典属于不可哈希类型,因此抛出unhashable type: 'ReturnDict'错误。
  2. 你把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:57:34