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

Django类视图get_context_data参数缺失与重定向时'str'对象无user属性问题求助

解决Django类视图get_context_data中重定向的错误问题

问题根源分析

你遇到的两个错误本质上都是因为误用了get_context_data方法的核心职责:

  1. get_context_data的唯一作用是构建模板渲染所需的上下文字典,它必须返回字典类型,绝对不能返回重定向响应(redirect)或者字符串。当你返回redirect时,Django会把这个响应对象当成上下文去处理,尝试访问它的user属性,自然会抛出'str' object has no attribute 'user'的错误。
  2. 给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:44:09