Django类视图Category列表分页报unhashable type slice错误
问题描述
搭建Category分类页面实现按所属分类筛选对应文章的功能时,遇到如下问题:
- 未给
views.py中的类视图添加pagination分页配置前,功能运行正常 - 添加
paginate_by分页配置后,触发unhashable type: slice报错
现有实现代码
views.py
class CatListView(ListView): template_name = 'academy/category.html' context_object_name = 'catlist' paginate_by = 2 def get_queryset(self): content = { 'cat': self.kwargs['category'], 'posts': ContentPost.objects.filter(category__name=self.kwargs['category']) } return content def category_list(request): category = Category.objects.exclude(name='default') context = { 'category' : category, } return context
urls.py 路由配置
path('academy/category/<category>/', CatListView.as_view(),name='academy-category'),
报错原因
Django的ListView类视图中,get_queryset()方法的返回值必须是支持切片操作的QuerySet(查询集)对象,内置分页逻辑会对该返回值做切片处理来实现分页。
当前代码中get_queryset()返回的是字典类型,字典不支持切片操作,因此触发类型错误。
另外现有代码中独立的category_list函数只返回了上下文字典、没有返回渲染后的响应,本身是无效逻辑。
修复方案
- 调整
get_queryset()方法,仅返回需要分页的文章查询集 - 重写
get_context_data()方法,传递分类名、分类列表等额外的上下文数据 - 修正后的视图代码参考:
class CatListView(ListView): template_name = 'academy/category.html' context_object_name = 'posts' paginate_by = 2 def get_queryset(self): # 返回需要分页的文章查询集 return ContentPost.objects.filter(category__name=self.kwargs['category']) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 传入额外需要的上下文参数 context['cat'] = self.kwargs['category'] context['category_list'] = Category.objects.exclude(name='default') return context
模板对应调整:原来如果通过
catlist.posts遍历文章,修改后直接遍历posts即可;当前分类名通过{{ cat }}获取,全部分类列表通过{{ category_list }}获取,原有无效的category_list函数可以直接删除。
内容的提问来源于stack exchange,提问作者Farhad
相关产品推荐
相关产品推荐

