Django过滤器使用分页 [英] django-filter use paginations

查看:271
本文介绍了Django过滤器使用分页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 django-filter 包提供搜索功能在我的列表视图中.

I'm using the django-filter package to provide a search functionality on my List View.

现在我也想在该视图中添加分页.
我正在尝试将分页与过滤后的查询集结合起来,但是我不知道如何继续.

Now I want to add a pagination to that view as well.
I'm trying to combine pagination to a filtered queryset, but I have no clue on how to go on.

到目前为止,我已经在views.py上尝试过以下方法:

So far, I have tried the following on views.py:

def search(request):
    qs = local_url.objects.filter(global_url__id=1).all()
    paginator = Paginator(qs, 25)
    page = request.GET.get('page')
    try:
        pub = paginator.page(page)
    except PageNotAnInteger:
        pub = paginator.page(1)
    except EmptyPage:
       pub = paginator.page(paginator.num_pages)
    url_filter = PublicationFilter(request.GET, queryset=qs)
    return render(request, 'ingester/search_list.html', {'filter': url_filter, 'publication':pub})

推荐答案

要使用Django过滤器并对过滤后的结果进行分页,您可以执行以下操作:

To use Django Filter and paginate the filtered result you can do the following:

  1. 为模型创建过滤器类:

  1. Create a filter class for your model:

my_project/my_app/filters.py上:

import django_filters

class MyModelFilter(django_filters.FilterSet):
    class Meta:
        model = MyModel
        # Declare all your model fields by which you will filter
        # your queryset here:
        fields = ['field_1', 'field_2', ...]

  • 每个FilterSet对象都有一个.qs属性,该属性包含过滤后的查询集,您甚至可以

  • Every FilterSet object has a .qs property which contains the filtered queryset and you can even override it if you want.

    我们将对MyModelFilter.qs属性进行分页:

    We will paginate the .qs property of our MyModelFilter:

    my_project/my_app/views.py上:

    from . import filters
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    def my_view(request):
        # BTW you do not need .all() after a .filter() 
        # local_url.objects.filter(global_url__id=1) will do
        filtered_qs = filters.MyModelFilter(
                          request.GET, 
                          queryset=MyModel.objects.all()
                      ).qs
        paginator = Paginator(filtered_qs, YOUR_PAGE_SIZE)
    
        page = request.GET.get('page')
        try:
            response = paginator.page(page)
        except PageNotAnInteger:
            response = paginator.page(1)
        except EmptyPage:
            response = paginator.page(paginator.num_pages)
    
        return render(
            request, 
            'your_template.html', 
            {'response': response}
        )
    

  • 就在那里!


    PS_1:根据我的经验,Django过滤器


    PS_1: Django filter in my experience, "plays" better with Django Rest Framework.

    PS_2:如果您要使用DRF,我已经写了一个示例,说明如何在基于函数的视图中使用分页,您可以轻松地将其与FilterSet结合使用:

    PS_2: If you are about to utilize DRF, I have written an example on how to use pagination in a function based view which you can easily combine with a FilterSet:

    @api_view(['GET',])
    def my_function_based_list_view(request):
        paginator = PageNumberPagination()
        filtered_set = filters.MyModelFilter(
                           request.GET, 
                           queryset=MyModel.objects.all()
                       ).qs
        context = paginator.paginate_queryset(filtered_set, request)
        serializer = MyModelSerializer(context, many=True)
        return paginator.get_paginated_response(serializer.data)
    

    这篇关于Django过滤器使用分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆