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
相关产品推荐
相关产品推荐

