Django-Filter与分页集成报错:'PostsFilter'对象无len()方法
Django-Filter 结合分页报错的解决办法
问题出在你传给Paginator的是过滤器实例f,而不是它对应的查询集。Paginator需要接收可计算长度的查询集对象,PostsFilter实例本身没有len()方法,所以会触发报错。
解决方法很简单:用过滤器的qs属性获取过滤后的查询集,再传给Paginator即可。
修改后的完整代码:
def posts(request): f = PostsFilter(request.GET, queryset=Post.objects.all()) # 用过滤后的查询集初始化分页器 paginator = Paginator(f.qs, 50) page_number = request.GET.get("page") posts_qs = paginator.get_page(page_number) return render(request, 'posts/posts.html', { 'posts': posts_qs, 'filter': f, 'title': 'Posts' })
关键修改说明
- 删掉了多余的
posts = Post.objects.all(),直接通过f.qs获取原始或过滤后的查询集 - 将
Paginator(posts, 50)改为Paginator(f.qs, 50):f.qs会自动适配场景——如果请求里没有过滤参数,它就是完整的Post.objects.all();如果有参数,就是过滤后的结果 - 这样分页逻辑会完全基于用户筛选后的内容计算,同时保留过滤器的表单渲染功能
内容的提问来源于stack exchange,提问作者Arnold Schwartzkopf
相关产品推荐
相关产品推荐

