Django-фильтр не работает с пагинацией Получение объекта типа 'PostsFilter' не имеет len()

Я пытаюсь заставить Django-Filter работать с Pagination - но он работает только когда я передаю 'posts' в Paginator - но когда я пытаюсь передать f - я получаю ошибку >>> object of type 'PostsFilter' has no len()

В остальном все работает нормально.

Есть ли предложения по обходному пути? Пожалуйста, посмотрите мой файл 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'

        })


Вы на самом деле не фильтруете данные, поскольку вы создаете фильтр, а затем ничего с ним не делаете, кроме передачи в шаблон. Вы должны сначала пропустить данные через фильтр, а затем перечислить post_filter.qs. Затем вы перечисляете .object_list страницы, так:

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.

Вернуться на верх