2017-05-18 56 views
6

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

现在我想为该视图添加分页。
我试图将分页结合到一个过滤的查询集,但我不知道如何继续下去。

到目前为止,我已经尝试了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}) 
+0

有您所创建的用于分页的html模板? – doru

+0

是的,我把它留在我的例子中,因为我的主要问题是如何在我的视图中将Filterset Object与Paginator结合起来。 –

+1

嗨@AnhTuanNguyen你有没有发现任何答案有帮助? –

回答

1

我了解你的目标是你的分页过滤查询集。如果是这样,你可以通过 “QS” PublicationFilter对象的属性来分页程序构造:

def search(request): 
    qs = local_url.objects.filter(global_url__id=1).all() 
    url_filter = PublicationFilter(request.GET, queryset=qs) 
    paginator = Paginator(url_filter.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', {'publication':pub}) 

url_filter.qs包含过滤查询集
url_filter.queryset包含非过滤查询集

1

要使用Django筛选和分页筛选结果,您可以执行以下操作:

  1. 创建一个过滤器类模型:

    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', ...] 
    
  2. 每个FilterSet对象都有一个.qs属性,它包含了过滤的queryset,您甚至可以override it if you want

  3. 我们将分页我们MyModelFilter.qs属性:

    my_project/my_app/views.py

    from . import filters 
    
    
    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的过滤器在我的经验, "plays" better with Django Rest Framework

PS_2:如果你要利用DRF,我已经写了关于如何在基于功能视图中使用分页的例子,你可以很容易地用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)