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
相关产品推荐
相关产品推荐

