Django-Filter not working with Pagination Getting object of type 'PostsFilter' has no len()

I'm trying to make Django-Filter work with Pagination--but it only works when I pass the 'posts' to Paginator--but when I try to pass the f--I get an error >>> object of type 'PostsFilter' has no len()

Other than that everything works fine.

Any suggestions on a workaround? Please see my views.py.

views.py


def posts(request):
    posts = Post.objects.all()

    f = PostsFilter(request.GET, queryset=Post.objects.all())

    paginator = Paginator(posts, 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'

        })


You are not really filtering the data, since you construct a filter, and then do nothing with it, except passing it to the template. You should first pass it through the filter, and then paginate the post_filter.qs. You then enumerate over the .object_list of the page, so:

def posts(request):
    posts = Post.objects.all()
    post_filter = PostsFilter(request.GET, queryset=posts)
    paginator = Paginator(post_filter.qs, 50)
    page_number = request.GET.get('page')
    posts_qs = paginator.get_page(page_number)
    return render(
        request,
        'posts/posts.html',
        {'posts': posts_qs.object_list, 'filter': post_filter, 'title': 'Posts'},
    )

That being said, I would strongly advise not to do pagination in a function-based view (FBV). We can work with a ListView [Django-doc] making the process easier.

Back to Top