Paginator¶
Django tillhandahåller några klasser som hjälper dig att hantera paginerad data - det vill säga data som är uppdelad på flera sidor, med ”Föregående/Nästa”-länkar. Dessa klasser finns i django/core/paginator.py.
För exempel, se Pagination topic guide.
klassen Paginator
¶
- class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True, error_messages=None)[source]¶
En paginator fungerar som en sekvens av
Page
när du använderlen()
eller itererar den direkt.
- Paginator.object_list¶
Krävs. En lista, tupel,
QuerySet
eller annat objekt som kan skäras med encount()
eller__len__()
metod. För konsekvent paginering börQuerySet
beställas, t.ex. med enorder_by()
klausul eller med en standardordering
på modellen.Prestandaproblem vid paginering av stora
QuerySet
Om du använder en
QuerySet
med ett mycket stort antal objekt kan det gå långsamt att begära höga sidnummer i vissa databaser, eftersom den resulterandeLIMIT
/OFFSET
-frågan måste räkna antaletOFFSET
-poster, vilket tar längre tid när sidnumret blir högre.
- Paginator.per_page¶
Obligatoriskt. Det maximala antalet objekt som ska inkluderas på en sida, exklusive föräldralösa barn (se det valfria argumentet
orphans
nedan).
- Paginator.orphans¶
Valfritt. Använd detta när du inte vill ha en sista sida med mycket få objekt. Om den sista sidan normalt skulle ha ett antal objekt som är mindre än eller lika med
orphans
, läggs dessa objekt till på föregående sida (som blir den sista sidan) i stället för att objekten lämnas på en sida för sig själva. Om det t.ex. finns 23 objekt,per_page=10
ochorphans=3
, kommer det att finnas två sidor: den första sidan med 10 objekt och den andra (och sista) sidan med 13 objekt.orphans
är noll som standard, vilket innebär att sidorna aldrig kombineras och att den sista sidan kan ha ett objekt.
- Paginator.allow_empty_first_page¶
Valfritt. Huruvida den första sidan får vara tom eller inte. Om
False
ochobject_list
är tom, så kommer ettEmptyPage
fel att uppstå.
- Paginator.error_messages¶
Med argumentet
error_messages
kan du åsidosätta de standardmeddelanden som paginatorn kommer att ge. Skicka in en ordbok med nycklar som matchar de felmeddelanden som du vill åsidosätta. Tillgängliga nycklar för felmeddelanden är:invalid_page
,min_page
ochno_results
.Här är till exempel standardfelmeddelandet:
>>> from django.core.paginator import Paginator >>> paginator = Paginator([1, 2, 3], 2) >>> paginator.page(5) Traceback (most recent call last): ... EmptyPage: That page contains no results
Och här är ett anpassat felmeddelande:
>>> paginator = Paginator( ... [1, 2, 3], ... 2, ... error_messages={"no_results": "Page does not exist"}, ... ) >>> paginator.page(5) Traceback (most recent call last): ... EmptyPage: Page does not exist
Metoder¶
- Paginator.get_page(number)[source]¶
Returnerar ett
Page
-objekt med det angivna 1-baserade indexet och hanterar även sidnummer utanför intervallet och ogiltiga sidnummer.Om sidan inte är en siffra returneras den första sidan. Om sidnumret är negativt eller större än antalet sidor, returneras den sista sidan.
Utlöser ett
EmptyPage
-undantag endast om du angerPaginator(..., allow_empty_first_page=False)
ochobject_list
är tom.
- Paginator.page(number)[source]¶
Returnerar ett
Page
-objekt med det angivna 1-baserade indexet. UtlöserPageNotAnInteger
omnumber
inte kan konverteras till ett heltal genom att anropaint()
. RaisesEmptyPage
om det angivna sidnumret inte existerar.
- Paginator.get_elided_page_range(number, *, on_each_side=3, on_ends=2)[source]¶
Returnerar en 1-baserad lista med sidnummer som liknar
Paginator.page_range
, men kan lägga till en ellips på endera eller båda sidorna av det aktuella sidnumret omPaginator.num_pages
är stort.Antalet sidor som ska inkluderas på varje sida av det aktuella sidnumret bestäms av argumentet
on_each_side
, som har standardvärdet 3.Antalet sidor som ska inkluderas i början och slutet av sidintervallet bestäms av argumentet
on_ends
, som har standardvärdet 2.Med standardvärdena för
på_varje_sida
ochpå_slut
blir till exempel sidintervallet[1, 2, '...', 7, 8, 9, 10, 11, 12, 13, '...', 49, 50]
om den aktuella sidan är 10 och det finns 50 sidor. Detta resulterar i sidorna 7, 8 och 9 till vänster om och 11, 12 och 13 till höger om den aktuella sidan samt sidorna 1 och 2 i början och 49 och 50 i slutet.Utlöser
InvalidPage
om det angivna sidnumret inte existerar.
Attribut¶
- Paginator.ELLIPSIS¶
En översättningsbar sträng som används som ersättning för sidnummer i sidintervallet som returneras av
get_elided_page_range()
. Standard är`...'
.
- Paginator.count[source]¶
Det totala antalet objekt på alla sidor.
Observera
När
Paginator
ska bestämma antalet objekt som finns iobject_list
, kommerPaginator
först att försöka anropaobject_list.count()
. Omobject_list
inte har någoncount()
metod, så kommerPaginator
att falla tillbaka till att användalen(object_list)
. Detta gör att objekt, somQuerySet
, kan använda en mer effektivcount()
metod när den finns tillgänglig.
klass Page
¶
Du konstruerar vanligtvis inte Page
-objekt för hand - du får dem genom att iterera Paginator
, eller genom att använda Paginator.page()
.
- class Page(object_list, number, paginator)[source]¶
En sida fungerar som en sekvens av
Page.object_list
när man använderlen()
eller itererar den direkt.
Metoder¶
- Page.next_page_number()[source]¶
Returnerar nästa sidnummer. Utlöser
InvalidPage
om nästa sida inte finns.
- Page.previous_page_number()[source]¶
Returnerar föregående sidnummer. Utlöser
InvalidPage
om föregående sida inte finns.
- Page.start_index()[source]¶
Returnerar det 1-baserade indexet för det första objektet på sidan, i förhållande till alla objekt i paginatorns lista. Till exempel:, vid paginering av en lista med 5 objekt med 2 objekt per sida, skulle den andra sidans
start_index()
returnera3
.
- Page.end_index()[source]¶
Returnerar det 1-baserade indexet för det sista objektet på sidan, i förhållande till alla objekt i paginatorns lista. Till exempel:, vid paginering av en lista med 5 objekt med 2 objekt per sida, skulle den andra sidans
end_index()
returnera4
.
Attribut¶
- Page.object_list¶
Listan över objekt på den här sidan.
- Page.number¶
Det 1-baserade sidnumret för den här sidan.
Undantag¶
- exception InvalidPage[source]¶
En basklass för undantag som uppstår när en paginator får ett ogiltigt sidnummer.
Metoden Paginator.page()
ger upphov till ett undantag om den begärda sidan är ogiltig (dvs. inte ett heltal) eller inte innehåller några objekt. I allmänhet räcker det med att fånga undantaget InvalidPage
, men om du vill ha mer detaljerad information kan du fånga något av följande undantag:
- exception EmptyPage[source]¶
Utlöses när
page()
ges ett giltigt värde men inga objekt finns på den sidan.
Båda undantagen är subklasser av InvalidPage
, så du kan hantera dem båda med except InvalidPage
.