Django HitCountDetailView报无category属性错误该如何解决?
错误原因
- 你在
get_context_data方法中直接通过self.category、self.slug取值,这里的self指代的是当前视图类的实例,本身不携带Post模型的字段属性,因此会抛出属性不存在的错误。 - 额外隐藏问题:你自定义的视图类名和继承的父类名完全一致,都是
HitCountDetailView,会触发继承递归异常,需要先修改自定义类名。 - 你提供的Post模型代码中
category字段缩进错误,和其他字段不同级,会导致模型定义失败。
修复代码
修正后的视图代码
# 先给导入的父类起别名,避免和自定义类重名 from hitcount.views import HitCountDetailView as BaseHitCountDetailView class PostDetailView(BaseHitCountDetailView): model = Post template_name = 'detail.html' context_object_name = 'post' slug_field = 'slug' count_hit = True def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # DetailView 完成查询后会将当前请求的对象存入 self.object 属性 current_post = self.object # 兼容无分类的场景,避免过滤时报错 if current_post.category: context['similar_posts'] = Post.objects.filter( category=current_post.category ).exclude(slug=current_post.slug) else: # 无分类时返回空查询集 context['similar_posts'] = Post.objects.none() return context
修正后的路由代码
# 补充slug类型转换器,写法更规范 path('detail/<slug:slug>/', PostDetailView.as_view(), name='post-detail')
修正后的Post模型代码
class Post(models.Model): title = models.CharField(max_length=200) # 修复缩进问题 category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True, blank=True) slug = models.SlugField(max_length=100, unique=True, editable=True)
内容的提问来源于stack exchange,提问作者sam hassan
相关产品推荐
相关产品推荐

