2017-10-24 1 views
0

Paginator Die Anzahl der Seiten wird nach dem Filtern mit django_filter nicht in HTML aktualisiert.Paginator Die Anzahl der Seiten wird nach Filtern der Ergebnisse nicht in HTML aktualisiert - Django

html-Datei

<span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</span> 

Die page_obj.paginator.num_pages ist die Anfangsnummer (ohne Filter) alle Ergebnisse in der Tabelle (Beispiel: Ich habe 12 Ergebnisse und zeigt 3 Ergebnisse/Seite => 4 Seiten)

Ansichten

class SearchBookView(ListView): 
    template_name = "booksearch.html" 
    paginate_by = 3 
    model = Book 

def get_context_data(self, **kwargs): 
    context = super().get_context_data(**kwargs) 
    book_qs = Book.objects.all() 
    book_filter = BookFilter(self.request.GET, queryset=book_qs) 
    paginator = Paginator(book_filter.qs, self.paginate_by) 

    print(paginator.num_pages) ### Prints the correct num pages everytime even after filtering 

    page = self.request.GET.get('page') 

    try: 
     book_list = paginator.page(page) 
    except PageNotAnInteger: 
     book_list = paginator.page(1) 
    except EmptyPage: 
     book_list = paginator.page(paginator.num_pages) 

    context['book_list'] = book_list 
    context['book_filter'] = book_filter 
    return context 

Nach einer fil Hinzufügen ter (sagen wir nach dem Filtern zeigt es 5 Ergebnisse) page_obj.paginator.num_pages sollte 2 in meinem HTML, richtig? Obwohl es meiner Ansicht nach in print(paginator.num_pages) 2 zeigt, bleiben im HTML die ursprünglichen 4 Seiten. Wie kann ich das an die HTML-Datei weitergeben?

EDIT

Filter

class BookFilter(django_filters.FilterSet): 
    name = django_filters.CharFilter(lookup_expr='icontains') 
    author = django_filters.CharFilter(lookup_expr='icontains') 
    category = django_filters.CharFilter(lookup_expr='icontains') 

    class Meta: 
     model = Book 
     ields = ['name', 'author', 'category',] 

vollständigen html

<h1 class="h1"> Search Books </h1> 
<form method="get"> 
    {{ book_filter.form.as_p }} 
    <button type="submit">Search</button> 
</form> 
<div class="container"> 
    <table> 
     <thead> 
      <tr> 
       <th>Name</th> 
       <th>Author</th> 
       <th>Category</th> 
      </tr> 
     </thead> 
     <tbody> 
     {% for book in book_list %} 
      <tr> 
       <td>{{ book.name }}</td> 
       <td>{{ book.author }}</td> 
       <td>{{ book.category }}</td> 
      </tr> 
     {% endfor %} 
     </tbody> 
    </table> 
    {% if is_paginated %} 
     <ul class="pagination"> 
     {% if page_obj.has_previous %} 
      <li> 
       <span><a href="?page={{ page_obj.previous_page_number }}">Previous</a></span> 
      </li> 
     {% endif %} 
      <li class=""> 
       <span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</span> 
      </li> 
     {% if page_obj.has_next %} 
      <li> 
       <span><a href="?page={{ page_obj.next_page_number }}">Next</a></span> 
      </li> 
     {% endif %} 
     </ul> 
     {% else %} 
      <p>No books available</p> 
     {% endif %} 
</div> 

Abhilfe

habe ich eine Abhilfe, aber es ist ein bisschen hässlich:

in meiner Ansicht ich eine context['num_pages'] = paginator.num_pages hinzugefügt und übergeben es mein HTML:

<span>Page {{ page_obj.number }} of {{ num_pages }}.</span> 

Vorschläge, wie dies das zu tun korrekte Art und Weise, ohne einen neuen Kontextschlüssel, Wertpaar hinzuzufügen?

+0

Was meinen Sie "Nach dem Hinzufügen eines Filters"? –

+0

Ein Update bearbeiten mit vollständiger HTML- und Filterklasse hinzugefügt. Ein Filter gibt die Ergebnisse eines benutzerdefinierten Abfragesatzes zurück (Beispiel: Ich möchte Ergebnisse mit allen Büchern anzeigen, die in der Kategorie "Fiction" enthalten sind). Hoffentlich kann ich erklären, wie ich neu bei Py und Django bin –

Antwort

1

Sie sollten das Abfrage-Set in der get_queryset-Methode festlegen.

def get_queryset(self): 
    book_qs = Book.objects.all() 
    self.book_filter = BookFilter(self.request.GET, queryset=book_qs) 
    return book_filter.qs 

Django kümmern die queryset von Paginieren, und alles, was Sie in get_context_data tun müssen, ist book_filter dem Kontext hinzufügen.

def get_context_data(self, **kwargs): 
    context = super().get_context_data(**kwargs) 
    context['book_filter'] = self.book_filter 
    return context 
Verwandte Themen