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

Django中get_success_url返回锚点页报错TypeError: quote_from_bytes() expected bytes

Django重定向带锚点时报错TypeError: quote_from_bytes() expected bytes

我来帮你解决这个问题,先看一下错误根源:你的get_success_url方法返回了redirect()函数的结果,但Django要求这个方法返回字符串类型的URL路径,而不是HttpResponseRedirect对象。当Django尝试把这个对象当作URL字符串去处理编码时,就会触发quote_from_bytes()的类型错误。

解决方案一:直接返回拼接好的URL字符串

修改你的get_success_url方法,去掉redirect(),直接返回带锚点的URL字符串:

def get_success_url(self):
    pk = self.object.employee.pk
    return '{}#education'.format(reverse('profile', kwargs={'pk': pk}))

这样Django会自动把这个字符串包装成HttpResponseRedirect,处理编码也不会有问题。

解决方案二:重写form_valid方法返回redirect

如果你更习惯用redirect()函数,可以选择重写form_valid方法,而不是依赖get_success_url:

def form_valid(self, form):
    # 先调用父类的form_valid完成数据保存
    super().form_valid(form)
    pk = self.object.employee.pk
    # 直接返回redirect对象
    return redirect('{}#education'.format(reverse('profile', kwargs={'pk': pk})))

为什么会报错?

从你的报错堆栈能看到,form_valid方法最终会执行return HttpResponseRedirect(self.get_success_url()),如果get_success_url返回的是redirect()生成的HttpResponseRedirect对象,那这里就相当于把一个对象传给了另一个HttpResponseRedirect的构造函数,Django会把这个对象强制转成字符串,导致后续的URL编码处理混乱,触发了quote_from_bytes()的类型错误。

内容的提问来源于stack exchange,提问作者Jekson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:39:36