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

Django ListView重写get方法后pagination分页失效,按首字母筛选查询集问题

Django ListView 分页与字母筛选兼容方案

问题根因

你完全重写了ListView的get方法,直接自行构造上下文并返回响应,跳过了父类内置的分页逻辑处理流程,因此配置的paginate_by参数未被触发,分页功能失效。

修正方案

不要重写get方法,改为重写get_queryset方法实现动态筛选,该方法是ListView专门用来修改查询集的扩展点,修改后父类的分页逻辑会正常执行,不需要改动现有模板代码。

修正后代码

class ExpedientView(ListView):
    # 公共基础配置直接作为类属性
    queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name')
    template_name = 'dashboard-admin/portfoliorecords.html'
    paginate_by = 10
    context_object_name = 'portfolios'

    def get_queryset(self):
        # 先获取父类定义的基础查询集
        base_queryset = super().get_queryset()
        # 安全获取letter参数,无参数时默认返回空字符串
        letter = self.request.GET.get('letter', '')
        if letter:
            # 存在筛选条件时追加过滤规则
            base_queryset = base_queryset.filter(owner__last_name__istartswith=letter)
        return base_queryset

额外优化说明

原代码中直接使用request.GET['letter']获取参数,当请求未携带letter参数时会抛出KeyError异常,使用get方法设置默认值可以避免该问题。

内容的提问来源于stack exchange,提问作者add

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 07:54:04