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

