Django DetailView查询集使用报错,咨询是否允许及是否需改用ListView
问题解答
报错原因及修复
你遇到的报错是因为在related_products的查询中,错误使用了Product.category——这是模型类的字段描述符,并非当前商品的具体分类值。在DetailView中,当前访问的商品实例存储在self.object属性里,需要用这个实例的category来过滤相关商品。另外count是查询集方法,必须加括号调用才能获取统计数值。
修复后的views.py代码:
class ProductDetail(DetailView): model = Product def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 过滤当前商品同分类的商品,排除当前商品避免重复展示 context['related_products'] = Product.objects.filter( category=self.object.category ).exclude(id=self.object.id) context['categories'] = Category.objects.all() # 调用count()方法获取无分类商品数量 context['no_category_post_count'] = Product.objects.filter(category=None).count() return context
疑问解答
是否不允许在DetailView中获取查询集?
完全允许。DetailView的核心职责是展示单个对象,但get_context_data方法的设计目的就是让开发者添加额外的上下文数据,包括各类查询集、统计数据等,和展示单个对象的核心需求完全兼容。是否应该改用ListView来实现该需求?
不需要。ListView是为展示对象列表场景设计的,而你的核心需求是展示单个商品的详情页面,同时附带相关商品列表,DetailView是最贴合这个场景的视图类。改用ListView反而需要额外处理单个商品的查询逻辑,会让代码更复杂。
内容的提问来源于stack exchange,提问作者0892133
相关产品推荐
相关产品推荐

