添加分页后Django的filter过滤功能为什么无法正常工作?
问题原因及修复方案
1. 核心问题(导致所有页显示全量数据)
模板中遍历的是未分页的全量数据gem_list,而非分页后的page_obj对象。
2. 各文件修复步骤
views.py 修复
- 删除错误的queryset转list再过滤的逻辑,Python列表不存在
filter方法,你注释掉的原过滤逻辑是正确的 - 去掉冗余的重复赋值和异常捕获逻辑,
Paginator.get_page()原生支持处理页码非法、页码超出范围的场景,无需额外捕获异常
修复后代码如下:
def gem_list(request): # 直接用queryset过滤,无需转list,Paginator原生支持queryset gem_list = Rhyme.objects.filter(is_gem=True) paginator = Paginator(gem_list, 5) page_number = request.GET.get('page') page_obj = paginator.get_page(page_number) page_range = paginator.get_elided_page_range(number=page_obj.number) context = { 'page_obj': page_obj, 'paginator' : paginator, 'page_range' : page_range, } return render(request, 'rhymes/gem_list.html', context)
模板文件修复
把遍历全量数据的逻辑,改为遍历分页后的page_obj:
原来的代码:
{% for gem in gem_list %}
修改为:
{% for gem in page_obj %}
models.py 可选修复(不影响分页,但属于代码错误)
- 删除重复定义的
get_absolute_url方法,保留一个即可 - 修正
num_rhymes属性的语法错误:Rhyme.objects.all().count()(all后面加括号) - 修正
contributor_rhyme_count的过滤条件:Rhyme.objects.filter(contributor=self).count()
内容的提问来源于stack exchange,提问作者YCode
相关产品推荐
相关产品推荐

