2017-05-18 104 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)