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?
Was meinen Sie "Nach dem Hinzufügen eines Filters"? –
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 –