2009-11-06 5 views

risposta

37

Non so perché tutti stanno complicando le cose così tanto. Come mostra the documentation, tutti questi attributi sono già disponibili.

oggetti paginator avere un attributo count che mostra il numero totale di oggetti in tutte le pagine, e Page oggetti hanno start_index e end_index proprietà.

Quindi, supponendo che si passa il page al contesto modello:

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

whoa! questo è esattamente quello che stavo cercando. Grazie! – webgonewild

+1

Questo è stato molto utile - grazie. L'unica nota che avrei è che per impostazione predefinita in un 'ListView' l'oggetto è chiamato' page_obj' piuttosto che 'page'. – BigglesZX

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

o

paginatorInstance.num_pages # this is there by default 

non è stato così difficile, vero?

1

L'oggetto django Paginator ha una proprietà num_pages. Dal tuo punto di vista, puoi semplicemente passare i dati corretti al tuo modello e mostrarlo lì.

Così come (approssimativa) Esempio:

vista

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 
    } 

modello

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

(Ho scritto questo codice senza il beneficio di un compilatore, in modo da testare it)

+0

solo inviare paginator per modello e quindi accedere alle proprietà pagintator come: {{offers.previous_page_number}}, {{}} offers.next_page_number, {{offers.paginator.count}} – gerpaick

3

Dovrai fare qualcosa di moderatamente più complesso dietro le quinte. E per favore nota che mentre sono un python dev, ho usato werkzeug e jinja2 da molto tempo e quindi la mia sintassi di django è un po 'arrugginita. Anche questo era codificato a secco (come ho appena digitato qui nel browser) e dovrebbe essere testato per assicurarsi che funzioni come previsto.

Generalmente creerò un oggetto di impaginazione e lo passerò in un oggetto di query che non è filtrato dalle pagine, è inoltre possibile indicarne il numero per pagina e la pagina in cui ci si trova.

Quindi qualcosa di vagamente simile a:

Paginator(query, objects_per_page, current_page_number) 

E poi passare l'oggetto Paginator risultante nel modello.

All'interno init del Paginator che ci si vuole fare qualcosa di simile a:

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] 

Poi nel modello si farebbe qualcosa di simile

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

E più tardi, quando si è pronti per scorrere gli oggetti si può semplicemente iterare su paginator.objects.

Spero che ti dia un'idea generale di come puoi farlo in modo pulito.

+0

Peharps è meglio sottoclasse la classe django.core.paginator.Paginator integrata per aggiungere gli attributi lower_limit e upper_limit. – webgonewild

+0

Molto possibile, non ho usato il django da un po 'di tempo. Anche le num_pages sembrano essere una stat non valida da dove mi siedo. Sembra che tu voglia il numero totale di oggetti, non il numero totale di pagine, ma potrebbe esserci un'altra soluzione per l'impaginatore di django. –

Problemi correlati