2009-11-06 2 views
9

Hallo, alle zusammen!Zeige Seitenanzahl in Django Paginierung

Ich versuche herauszufinden, wie etwas wie "Zeige 1-10 von 52" mit django Paginierung in meinen Vorlagen anzeigen.

Ich habe die Paginierung selbst durchgeführt, aber mir fällt diese Anforderung nicht ein. Irgendwelche Ideen?

Antwort

37

Ich weiß nicht, warum jeder die Dinge so kompliziert macht. Wie the documentation zeigt, sind alle diese Attribute bereits verfügbar.

Paginator Objekte haben ein count Attribut, das die Gesamtzahl der Objekte auf allen Seiten zeigt, und Page Objekte haben start_index und end_index Eigenschaften. So

, vorausgesetzt, Sie passieren die page, um die Vorlage Kontext:

{{ page.start_index }} to {{ page.end_index }} of {{ page.paginator.count }}. 
+0

whoa! das ist genau das was ich gesucht habe. Vielen Dank! – webgonewild

+1

Das war sehr hilfreich - danke. Nur zu beachten wäre, dass das Objekt in einer 'ListView' standardmäßig 'page_obj' genannt wird und nicht' page'. – BigglesZX

0
totalPages = math.ceil(float(totalRecords)/recordsPerPage) 

oder

paginatorInstance.num_pages # this is there by default 

war nicht so schwer, oder?

1

Das Objekt django Paginator hat eine num_pages Eigenschaft. Aus Ihrer Sicht können Sie einfach die richtigen Daten an Ihre Vorlage übergeben und dort anzeigen.

So als (grob) Beispiel:

Ansicht

current_page = ## input param 
items_per_page = 10 
paginator = Paginator(result, items_per_page)  

... 
return render_to_response('template.html', 
    { 
    'num_pages': paginator.num_pages, 
    'start_count': items_per_page * current_page + 1, 
    'end_count': (items_per_page * current_page + 1) + len(paginator(current_page).object_list) 
    'items_per_page': items_per_page 
    } 

Vorlage

showing {{start_count} - {{end_count}} of {{num_pages}} 

(ich diesen Code ohne den Vorteil eines Compilers geschrieben, so Test es)

+0

nur paginator senden Vorlage und dann pagintator Eigenschaften wie Zugang: {{offers.previous_page_number}}, {{offers.next_page_number}}, {{offers.paginator.count}} – gerpaick

3

Sie müssen etwas Komplexer hinter den Kulissen tun. Und bitte beachte, dass ich, während ich ein Python-Entwickler bin, schon lange mit Werkzeug und Jinja2 gearbeitet habe und meine Django-Syntax ein wenig eingerostet ist. Auch dies wurde trocken-codiert (wie ich es hier im Browser eingegeben) und sollte getestet werden, um sicherzustellen, dass es wie vorgesehen funktioniert.

Im Allgemeinen werde ich ein Paginierungsobjekt erstellen und es in einem Abfrageobjekt übergeben, das nicht nach Seiten gefiltert wird. Sie können auch angeben, wie viele Seiten und Seiten Sie verwenden.

So etwas vage ähnlich wie:

Paginator(query, objects_per_page, current_page_number) 

Und dann passieren die resultierende Paginatorobjekt in die Vorlage.

im Inneren des init paginator Sie etwas Ähnliches tun wollen würde:

def __init__(self, query, objects_per_page, current_page_number): 
    self.total = query.count() 

    self.per_page = objects_per_page 
    self.current_page_number = current_page_number 
    self.lower_limit = objects_per_page * current_page_number 
    self.upper_limit = objects_per_page * (current_page_number + 1) 

    if self.upper_limit > self.total: 
     self.upper_limit = self.total 

    self.objects = query[self.lower_limit - 1:self.upper_limit - 1] 

Dann in der Vorlage, die Sie so etwas wie

Showing {{paginator.lower_limit}}-{{paginator.upper_limit}} of {{paginator.total}} 

Und später tun würde, wenn Sie bereit sind, Um über die Objekte zu iterieren, können Sie einfach über paginator.objects iterieren.

Ich hoffe, das gibt Ihnen eine allgemeine Vorstellung davon, wie Sie das sauber machen können.

+0

Peharps ist es besser, die eingebaute django.core.paginator.Paginator Klasse abzuleiten, um die low_limit und die upper_limit Attribute hinzuzufügen. – webgonewild

+0

Sehr möglich, ich habe Django in einer ruhigen Weile nicht benutzt. Auch die num_pages scheinen ein ungültiger stat von wo ich sitze. Sie scheinen die Gesamtzahl der Objekte zu haben, nicht die Gesamtzahl der Seiten, es könnte jedoch eine andere Lösung in Djangos Paginator geben. –