¿Cómo agregar Paginación en Django Project?

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.

Publicación traducida automáticamente

Artículo escrito por riter79 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *