El sistema de paginación es una de las características más comunes en blogs, motores de búsqueda, listas de resultados, etc. Al ver la popularidad del sistema de paginación, los desarrolladores de django han creado una clase Paginator para que los desarrolladores web no tengan que pensar en la lógica para hacer paginadores.
Paginator Class en vivo en django/core/paginator.py. Entonces, para usar Paginator Class, primero debemos importarlo desde django.core.paginator
from django.core.paginator import Paginator
Sintaxis:
p = Paginator(list_of_objects, no_of_objects_per_page)
El primer argumento es la lista de objetos que se distribuirán en las páginas. El segundo argumento indica el número de objetos que se mostrarán en cada página. Estos dos argumentos son necesarios.
Sin embargo Paginator Class toma dos argumentos opcionales más que se enumeran a continuación:
- huérfanos : su valor debe ser un número entero menor que el valor no_of_objects_per_page. Indica si la última página tiene un número mínimo de objetos. Si el número de objetos restantes en la última página es menor o igual que el valor de este argumento, esos objetos se agregarán a la página anterior. El valor predeterminado es 0.
- allow_empty_first_page – Toma valores booleanos. Si se permite o no que la primera página esté vacía.
Nota: el primer argumento no necesita ser una lista. En su lugar, puede ser una tupla, un conjunto de consultas u otro objeto segmentable con un método count() o __len__().
¿Cómo usar la clase Paginator?
Supongamos que estamos desarrollando un sitio web de blogs. Hemos definido el modelo de publicación en models.py y hemos creado 8 publicaciones de este tipo. Ahora en views.py, hemos escrito el siguiente código:
Python3
from django.shortcuts import render from .models import Post from django.core.paginator import Paginator # Create your views here. def index(request): posts = Post.objects.all() # fetching all post objects from database p = Paginator(posts, 5) # creating a paginator object # getting the desired page number from url page_number = request.GET.get('page') try: page_obj = p.get_page(page_number) # returns the desired page object except PageNotAnInteger: # if page_number is not an integer then assign the first page page_obj = p.page(1) except EmptyPage: # if page is empty then return last page page_obj = p.page(p.num_pages) context = {'page_obj': page_obj} # sending the page object to index.html return render(request, 'index.html', context)
En la tercera línea, se importa Paginator Class. En la función index hemos construido un objeto paginador llamado p . Este paginador crea objetos de página. Cada objeto de página tendrá el mismo número de objetos de publicación. Luego recuperamos el número de página deseado del parámetro de consulta ‘página’ de una solicitud GET. Este número de página se utiliza para extraer el objeto de página correcto.
Ahora en index.html –
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Django Paginator example</title> </head> <body> <div class="container"> {% for post in page_obj.object_list %} {# note that the list of posts are in the page_obj.object_list not page_obj #} <h1>{{post.title}}</h1> <small>{{post.author}}</small> <p>{{post.content}}</p> <hr/> {% endfor %} </div> <center> {%if page_obj.has_previous %} {# whether the previous page exists #} <a href="?page={{page_obj.previous_page_number}}"><</a> {# link to the prev page #} {% endif %} <span>{{page_obj.number}}</span> {# the current page number #} {%if page_obj.has_next %} {# whether the next page exists #} <a href="?page={{page_obj.next_page_number}}">></a> {# link to the next page #} {% endif %} </center> </body> </html>
Resultado :
En la imagen, enviamos el valor del número de página con una solicitud GET (indicada con un rectángulo). Puede ver la paginación en la parte inferior de la imagen (marcada con un rectángulo).
Aquí hay otra imagen de la última página:
Métodos :
Paginator.get_page (número_página) |
Toma un argumento numérico y devuelve un objeto de página con el índice basado en 1 dado. Si el argumento pasado no es un número, devuelve la primera página. Si el número de página es negativo o un número mayor que el número de páginas, devuelve la última página. Lanza un error de página vacía si la lista de objetos de la página está vacía y allow_empty_first_page se establece en falso en el objeto Paginator. |
Paginador.página(número) | También hace lo mismo pero genera un error de página no válida si la página de ese número no existe. |
Atributos:
Paginador.recuento | devuelve el número total de objetos en todas las páginas. |
Paginador.num_pages | devuelve el número total de páginas |
Paginador.page_range | devuelve un iterador de rango basado en 1 |
Sin embargo, como la clase Paginator usa la clase Page para distribuir objetos, será mejor si sabemos más sobre la clase Page.
Clase de página:
Generalmente, el objeto de página se usa en Paginator Class. Rara vez tiene que construirlo manualmente.
Sintaxis :
page = Page( object_list , number, paginator)
Aquí la lista de objetos es la lista de objetos, el argumento de número se usa para numerar el objeto de página. Paginator son los objetos Paginator para los que se construye este objeto de página.
Atributos:
Página.lista_de_objetos | devuelve la lista de objetos |
Número de página | devuelve el número del objeto de la página |
página.paginador | devuelve el objeto paginador correspondiente |
Métodos :
Página.has_next() | devuelve True si el siguiente objeto Page sale; de lo contrario, devuelve False |
Página.has_previous() | devuelve True si el objeto de página anterior sale; de lo contrario, devuelve False |
Página.tiene_otras_páginas() | Devuelve True si hay una página anterior o siguiente. |
Página.siguiente_número_de_página() | Devuelve el siguiente número de página. Genera InvalidPage si la página siguiente no existe. |
Página.número_de_página_anterior() | Devuelve el número de página anterior. Genera InvalidPage si la página anterior no existe. |
Página.start_index() | Devuelve el índice basado en 1 del primer objeto de la página, en relación con todos los objetos de la lista del paginador. |
Página.end_index() | Devuelve el índice basado en 1 del último objeto de la página, en relación con todos los objetos de la lista del paginador. |