In Django verwende ich den Paginator wie folgt:
von django.core.paginator importieren Paginator, EmptyPage, PageNotAnInteger
def myView(request):
...
paginator = Paginator(Annonce.objects.filter(name="huhu"), 10)
paginator._count = s.count()
try:
annonces = paginator.page(page)
except PageNotAnInteger:
annonces = paginator.page(1)
except EmptyPage:
annonces = paginator.page(paginator.num_pages)
In der Funktion s.search () führe ich eine Abfrage für meine Postgres-Datenbank aus.
Es stellt sich heraus, dass die Abfrage auch bei einer Anzeige von 10 Elementen pro Seite nicht eingeschränkt ist.
Ich habe versucht, die Abfrage mit einem zu begrenzen Annonce.objects.filter(name="huhu")[:10]
und die Zahl selbst angeben. Aber der Paginator funktioniert nicht, wenn ich das tue.
Gibt es eine Möglichkeit, dies zu optimieren?
Antworten:
10 für die Antwort № 1Verwenden Sie dieses Beispiel https://docs.djangoproject.com/en/dev/topics/pagination/#using-paginator-in-a-view als Leitfaden zum Schreiben einer Ansichtsfunktion, die Django Paginator entsprechend verwendet.
Beachten Sie, dass in dem Beispielcode-Snippert -
def listing(request):
contact_list = Contacts.objects.all()
paginator = Paginator(contact_list, 25) # Show 25 contacts per page
page = request.GET.get("page") # <--- This is the key to your solution.
contact_list
ist ein zugewiesenes Queryset, das noch nicht ausgewertet wurde. Das paginator = Paginator(contact_list, 25)
Zuordnung zu einem Paginator instance
ist faul und wird nicht wirklich hingerichtet, bis es muss.
page = request.GET.get("page")
erhält Ihre zusätzliche GET-Variable ?page=2
(als Beispiel) von Ihrer URL. Die URL würde tatsächlich so aussehen http://localhost:8000/my/listing?page=2
Wenn wir versuchen, die 25 Objekte abzurufen, die auf Ihrer Auflistungsseite angezeigt werden sollen, Seite 2.
Hier wird die eigentliche Abfrage an Ihre Datenbank ausgeführt: -
try:
contacts = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
contacts = paginator.page(1)
das contacts = paginator.page(page)
führt eine Abfrage an die Datenbank aus Abrufen nur einer begrenzten Anzahl von Objekten basierend auf der Seitennummer und unter der Bedingung, dass wir "25" Objekte pro Seite wünschen.