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

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函数只返回了上下文字典、没有返回渲染后的响应,本身是无效逻辑。

修复方案
  1. 调整get_queryset()方法,仅返回需要分页的文章查询集
  2. 重写get_context_data()方法,传递分类名、分类列表等额外的上下文数据
  3. 修正后的视图代码参考:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:15:43