2009-11-06 11 views

Respuesta

37

No sé por qué todos están complicando tanto las cosas. Como muestra the documentation, todos estos atributos ya están disponibles.

objetos Paginator tener un atributo count que muestra el número total de objetos a través de todas las páginas, y Page objetos tienen start_index y end_index propiedades.

Así, suponiendo que pase el page al contexto de la plantilla:

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

¡Whoa! esto es exactamente lo que estaba buscando. ¡Gracias! – webgonewild

+1

Esto fue muy útil, gracias. La única nota que tendría es que por defecto en un 'ListView' el objeto se llama' page_obj' en lugar de 'page'. – BigglesZX

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

o

paginatorInstance.num_pages # this is there by default 

No fue tan difícil, ¿verdad?

1

El objeto django Paginator tiene una propiedad num_pages. En su opinión, puede pasar los datos correctos a su plantilla y mostrarlos allí.

Así como (en bruto) ejemplo:

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 
    } 

plantilla

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

(que escribió el código sin el beneficio de un compilador, por lo que la prueba it)

+0

acaba de enviar paginador a la plantilla y luego acceder a las propiedades pagintator como: {{} offers.previous_page_number}, {{}} offers.next_page_number, {{offers.paginator.count}} – gerpaick

3

Tendrá que hacer algo moderadamente más complejo detrás de escena. Y tenga en cuenta que, aunque soy un desarrollador de python, he estado usando werkzeug y jinja2 durante mucho tiempo, por lo que mi sintaxis de django está un poco oxidada. También esto estaba codificado en seco (como en el que acabo de tipear aquí en el navegador) y debe probarse para asegurarse de que funciona según lo previsto.

Generalmente voy a crear un objeto de paginación, y pasarlo en un objeto de consulta que no está filtrado por páginas, también puede decirle cuántos por página y en qué página está.

Así que algo vagamente similar a:

Paginator(query, objects_per_page, current_page_number) 

y luego pasar el objeto paginador resultante en la plantilla.

Dentro init del paginador que querría hacer algo similar 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] 

Luego, en la plantilla que harías algo así como

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

Y más tarde cuando esté listo Para iterar sobre los objetos, puedes iterar sobre paginator.objects.

Espero que esto le dé una idea general de cómo puede hacer esto limpiamente.

+0

Peharps es mejor subclasificar la clase incorporada en django.core.paginator.Paginator para agregar los atributos lower_limit y upper_limit. – webgonewild

+0

Muy posible, no he usado django en silencio por un tiempo. También num_pages parece ser una estadística inválida desde donde me siento. Parece que desea el número total de objetos, no el número total de páginas, pero puede haber otra solución para eso en el paginador de django. –

Cuestiones relacionadas