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

Django中DetailView与CreateView重定向报错:对象无pk属性

解决Django DetailView/CreateView重定向时的"对象没有属性pk"错误

我之前也碰到过这个坑,咱们一步步拆解问题和解决方案:

问题根源

你在DetailView的get方法里直接用self.pk是不对的——DetailView本身并没有pk这个属性!这个pk要么是URL路由传递过来的参数(存在self.kwargs里),要么是视图要展示的模型实例的属性(存在self.object.pk里),但你直接访问self.pk自然会报错。

另外,如果你需要操作模型实例,得先调用self.get_object()初始化self.object,不然self.object是None,访问它的pk也会报错。

针对你的DetailView的修复方案

给你两种可行的写法,选哪种看你是否需要用到模型实例:

写法1:直接从URL参数取pk(不需要操作实例时用)

class check(DetailView):
    def get(self, request, *args, **kwargs):
        if ...:  # 你的判断条件
            # 从URL路由的kwargs里直接拿pk
            return redirect(reverse('no_edit', kwargs={"pk": self.kwargs['pk']}))
        # 其他逻辑或默认的get处理
        return super().get(request, *args, **kwargs)

写法2:先获取模型实例,用实例的pk(需要操作实例时用)

class check(DetailView):
    def get(self, request, *args, **kwargs):
        # 先调用get_object()初始化self.object
        self.object = self.get_object()
        
        if ...:  # 你的判断条件
            # 用实例的pk做重定向参数
            return redirect(reverse('no_edit', kwargs={"pk": self.object.pk}))
        # 其他逻辑或默认的get处理
        return super().get(request, *args, **kwargs)

额外:CreateView的重定向注意点

如果是CreateView里遇到类似问题,要注意必须在form_valid方法里操作——因为只有这里才会保存新创建的对象,self.object才会有值:

class YourCreateView(CreateView):
    def form_valid(self, form):
        # 保存对象后,self.object就是新创建的实例
        self.object = form.save()
        # 重定向到详情页
        return redirect(reverse('detail_view', kwargs={"pk": self.object.pk}))

小技巧:简化重定向写法

其实Django的redirect支持直接传入视图名和参数,不用手动调用reverse,代码更简洁:

# 替代reverse的写法
return redirect('no_edit', pk=self.kwargs['pk'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:51:02