2009-11-06 16 views

Odpowiedz

37

Nie wiem, dlaczego wszyscy tak bardzo komplikują sprawy. Jak pokazuje the documentation, wszystkie te atrybuty są już dostępne.

obiekty paginator mieć atrybut count który pokazuje całkowitą liczbę obiektów na wszystkich stronach i Page obiekty mają start_index i end_index właściwości.

Więc zakładając, że przechodzą page do kontekstu szablonu:

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

whoa! to jest dokładnie to, czego szukałem. dzięki! – webgonewild

+1

To było bardzo pomocne - dzięki. Mam tylko jedną uwagę, że domyślnie w 'ListView' obiekt nazywa się' page_obj', a nie 'page'. – BigglesZX

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

lub

paginatorInstance.num_pages # this is there by default 

nie było takie trudne, prawda?

1

Obiekt django Paginator ma właściwość num_pages. W twoim widoku możesz po prostu przekazać poprawne dane do swojego szablonu i tam je pokazać.

Więc jak (rough) Przykład:

widoku

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 
    } 

szablon

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

(pisałem ten kod bez korzystania z kompilatora, tak testu it)

+0

wystarczy wysłać paginator do szablonu, a następnie uzyskać dostęp do właściwości pagintator jak: {{offers.previous_page_number}}, {{offers.next_page_number}} {{offers.paginator.count}} – gerpaick

3

Musisz zrobić coś bardziej skomplikowanego za kulisami. I proszę zauważyć, że póki ja jestem deweloperem Pythona, używam werkzeug i jinja2 od dłuższego czasu, więc moja składnia django jest trochę zardzewiała. Również to zostało zakodowane na sucho (jak w tym po prostu wpisałem to tutaj w przeglądarce) i powinno być przetestowane, aby upewnić się, że działa zgodnie z przeznaczeniem.

Generalnie utworzę obiekt paginacji i przekazać go do obiektu zapytania, który nie jest filtrowany przez strony, można również określić liczbę stron i stronę, na której się znajdujesz.

Więc coś niejasno podobny do:

Paginator(query, objects_per_page, current_page_number) 

a następnie przekazać obiekt wynikowy paginator do szablonu.

wewnątrz paginator za init, że chcesz zrobić coś podobnego do:

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] 

Następnie w szablonie chcesz zrobić coś

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

A później, gdy jesteś gotowy iterować po obiektach, które można po prostu przetworzyć za pomocą paginator.objects.

Mam nadzieję, że daje to ogólne pojęcie o tym, jak można to czynić w prosty sposób.

+0

Peharps lepiej jest podklasować wbudowaną klasę django.core.paginator.Paginator, aby dodać atrybuty lower_limit i upper_limit. – webgonewild

+0

Bardzo możliwe, nie używałem django w spokoju przez jakiś czas. Również num_pages wydaje się być nieprawidłową statystyką z miejsca, w którym siedzę. Wygląda na to, że chcesz mieć całkowitą liczbę obiektów, nie całkowitą liczbę stron, ale może być inne rozwiązanie tego problemu w paginatorze django. –

Powiązane problemy