Django类视图get_context_data参数缺失与重定向时'str'对象无user属性问题求助
解决Django类视图get_context_data中重定向的错误问题
问题根源分析
你遇到的两个错误本质上都是因为误用了get_context_data方法的核心职责:
get_context_data的唯一作用是构建模板渲染所需的上下文字典,它必须返回字典类型,绝对不能返回重定向响应(redirect)或者字符串。当你返回redirect时,Django会把这个响应对象当成上下文去处理,尝试访问它的user属性,自然会抛出'str' object has no attribute 'user'的错误。- 给
get_context_data添加request参数是错误的——这个方法的默认参数里并没有request,Django调用它时不会传递这个参数,所以会触发missing 1 required positional argument: 'request'的报错。正确获取请求对象的方式是用self.request,但这也解决不了返回响应的问题,因为方法的职责本来就不是处理重定向。
正确解决方案:在dispatch方法中做权限校验与重定向
类视图的dispatch方法是请求进入视图后的第一个处理入口,适合用来做权限检查、重定向这类前置操作。我们把权限校验逻辑移到这里,让get_context_data只专注于构建上下文:
修改你的EditorEstandarView代码如下:
class EditorEstandarView(LoginRequiredMixin, TemplateView): template_name = "pages/editor-estandar/estandar.html" def dispatch(self, request, *args, **kwargs): # 先执行权限校验 if not request.user.groups.filter(name="Editor-Estandar").exists(): print("no puedes estar aqui") return redirect('redirect') # 校验通过,继续执行父类的dispatch流程 return super().dispatch(request, *args, **kwargs) def get_context_data(self, **kwargs): # 这里只负责构建上下文字典 context = super().get_context_data(**kwargs) context["sedes"] = Sede.objects.values("nombre", "id") context["recintos"] = Recinto.objects.values("id", "codigo", "nombre") context["carreras"] = Carrera.objects.values("id", "codigo", "nombre") return context
额外说明
LoginRequiredMixin已经确保了只有登录用户能访问这个视图,所以你不需要在get_context_data里再次处理未登录的情况。- 你的
redirect视图已经加了@login_required,但因为EditorEstandarView有LoginRequiredMixin,所以重定向过去的用户肯定是已登录状态,这个装饰器不会造成问题。
内容的提问来源于stack exchange,提问作者Nuevakenia
相关产品推荐
相关产品推荐

