2017-05-18 2 views
6

Ich verwende das django-filter-Paket, um eine Suchfunktionalität in meiner Listenansicht bereitzustellen.django-filter paginationen verwenden

Jetzt möchte ich auch eine Seitenumbruch zu dieser Ansicht hinzufügen.
Ich versuche, die Seitennummerierung mit einem gefilterten Abfrage-Set zu kombinieren, aber ich habe keine Ahnung, wie es weitergehen soll.

Bisher habe ich folgendes auf views.py versucht:

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

Haben Sie erstellt die HTML-Vorlage für die Paginierung? – doru

+0

Ja, ich habe es in meinem Beispiel weggelassen, weil mein Hauptproblem darin besteht, Filterset-Objekt mit dem Paginator aus meiner Sicht zu kombinieren. –

+1

Hey @AnhTuanNguyen Hast du irgendeine der Antworten hilfreich gefunden? –

Antwort

1

Wie ich Ihnen Ziel verstanden ist Ihre gefilterten Abfrage Satz Paginieren. Wenn ja, können Sie "qs" Eigentum von PublicationFilter Objekt Paginator Konstruktor übergeben:

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 gefiltert wird, enthält QuerySet
url_filter.queryset enthält ungefilterten QuerySet

1

nutzen zu können, Django Filtern und Paginieren des gefilterten Ergebnisses Sie können Folgendes tun:

  1. Erstellen Sie ein Filterklasse für Ihr Modell:

    Auf 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. Jedes FilterSet Objekt verfügt über eine .qs Eigenschaft, die die gefiltert queryset enthält und Sie können sogar override it if you want.

    Auf 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} 
        ) 
    

Und dort haben Sie es

  • Wir werden die .qs Eigentum unserer MyModelFilter Paginieren!


    PS_1: Django Filter in meiner Erfahrung "plays" better with Django Rest Framework.

    PS_2: Wenn Sie sind DRF zu nutzen, habe ich ein Beispiel geschrieben, wie Paginierung verwenden in einer Funktion basiert Ansicht, die Sie leicht mit einem FilterSet kombinieren:

    @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) 
    
  • Verwandte Themen