Mejore la eficiencia y la escalabilidad de su aplicación Django implementando la paginación. Aquí está todo lo que necesita saber para comenzar.
La paginación mejora la experiencia del usuario y el rendimiento de la aplicación cuando se trata de grandes conjuntos de datos. Sin un sistema de paginación implementado, su aplicación experimentará retrasos la mayor parte del tiempo. Con Django, puede aprovechar el soporte incorporado para la paginación para paginar su aplicación web.
Cómo funciona la paginación en Django
La implementación de la paginación en Django puede diferir dependiendo de si trabaja con vistas basadas en clases o basadas en funciones. Independientemente de su método preferido, los principios subyacentes siguen siendo los mismos.
Django usa una clase llamada Paginador para implementar la paginación. El Paginador class proporciona varios métodos que puede usar para personalizar su paginación. Al inicializar el Paginador clase, toma dos parámetros obligatorios; los datos a paginar y el número de elementos a mostrar por página. El
Paginador toma un tercer parámetro opcional para huérfanos para especificar el número mínimo de elementos que deben permanecer en la última página. De forma predeterminada, el valor de los huérfanos es 0, lo que significa que todas las páginas tienen el mismo número de elementos.La URL de una página paginada de Django es similar a esto: https://example.com/products/?page=3. El página El parámetro en la URL le dice a Django qué página quiere ver el usuario. También ayuda a Django a determinar qué parte de los datos mostrar para esa página.
El código utilizado en este proyecto está disponible en un repositorio GitHub y es gratis para su uso bajo la licencia MIT.
Configure su proyecto Django para paginación
Antes de paginar en Django, debe tener instaló Django y lo configuró en su computadora. Después de configurar Django en su computadora, debe crear una aplicación y un modelo para sus datos. Aquí hay un modelo simple que puede copiar:
de django.db importar modelos
claseCorreo(modelos. Modelo):
título = modelos. CharField (longitud_máxima=255)
autor = modelos. CharField (longitud_máxima=50)
contenido = modelos. Campo de texto('Publicar Contenido')
definitivamente__str__(ser):
devolver titulo propio
El modelo anterior es para una aplicación de blog. Define los campos de título, autor y contenido para cada publicación de blog. También tiene un método que devuelve el título de la publicación para una mejor experiencia de usuario en el panel de administración.
Migre su modelo ejecutando este comando:
python administrar.py hacer migraciones && python administrar.py migrar
Después de migrar su modelo, debe navegar a blog>admin.py para registrarlo. El siguiente código registra con éxito un modelo llamado Correo.
de django.contrib importar administración
de .modelos importar Correo # reemplaza 'Publicar' con el nombre de tu modelo
admin.site.register (Publicar)
A continuación, cree un superusuario y agregue publicaciones en su panel de administración de Django. Para crear un superusuario, use este comando:
python manage.py crear superusuario
El comando anterior lo llevará a través del proceso ilustrado en la imagen a continuación:
Después de crear un superusuario, ejecute su servidor de desarrollo y navegue hasta el panel de administración.
python manage.py servidor de ejecución
Una vez que su servidor se inicie, navegue hasta http://127.0.0.1:8000/admin, inicie sesión y agregue algunas publicaciones.
A continuación, cree una plantilla HTML para mostrar sus publicaciones en el navegador. Cree su archivo en el siguiente directorio: tu_aplicación/templates/tu_aplicación_nombre/index.html. Si no entiende cómo crear plantillas, lea nuestro guía introductoria a la arquitectura MVT de Django.
Paginación de Django en una vista basada en funciones
Django le permite crear aplicaciones con vistas basadas en clases o vistas basadas en funciones. Para paginar su aplicación utilizando una vista basada en funciones. Sigue estos pasos:
- Abre tu vistas.py archivar e importar el Paginador clase.
de django.core.paginator importar Paginador
- Cree una función de vista para representar publicaciones en su plantilla HTML.
de django.atajos importar prestar
de .modelos importar Correo
de django.core.paginator importar Paginador
definitivamentevista de la lista(pedido):
publicaciones = Publicar.objetos.todos()
devolver hacer (pedir, 'blog/blog_list_view.html', {'publicaciones':publicaciones})
- Cree un patrón de URL para mostrar sus publicaciones en el navegador. Comience configurando el patrón de URL en el directorio de su proyecto. Abre el urls.py archivo a nivel de proyecto y agréguelo al patrones de URL:
de django.urls importar incluir
patrones de URL = [
...,
camino('', incluir('blog.urls')),
]
En el fragmento de código anterior, reemplace Blog con el nombre de tu aplicación. Si no puede diferenciar entre un proyecto y una aplicación, debe saber cómo un proyecto difiere de una aplicación en Django.
Después de hacer la configuración anterior, cree un urls.py archivo en el directorio de su aplicación (en este caso, es el Blog carpeta) y agregue este fragmento de código:
de django.urls importar camino
de .puntos de vista importar vista de la lista
patrones de URL = [
camino('', lista_vista, nombre='vista de la lista'),
]
Cuando ejecuta su servidor y navega a http://127.0.0.1:8000/, el navegador mostrará sus publicaciones de acuerdo con su hoja de estilo especificada.
- Modifique su función de vista para agregar lógica de paginación. Aquí hay un ejemplo:
definitivamentevista de la lista(pedido):
publicaciones = Publicar.objetos.todos()
paginado = paginador (publicaciones, 3)
page_number = solicitud. OBTENER.obtener('página') #Obtener el número de página solicitado de la URL
página = paginado.get_page (page_number)
devolver hacer (pedir, 'blog/blog_list_view.html', {'página':página})
El fragmento de código anterior presenta tres nuevas variables: paginado, número de página, y página. Cada variable hace lo siguiente:
- El paginado variable inicializó el Paginador clase. En este escenario, los datos a paginar son el conjunto de consultas, publicaciones, y se necesita 3 como el número de elementos a mostrar por página.
- El número de página La variable obtiene el número de página de la URL. por ejemplo, en http://127.0.0.1:8000/?page=2, el número de página es 2.
- El página variable recupera la página específica para representar desde el paginado variable.
A estas alturas, Django debe haber paginado tu página. Puede navegar a páginas paginadas específicas utilizando el formato de URL que se muestra en esta imagen:
- Modifique su plantilla HTML para mostrar la navegación de las páginas paginadas. Utilizando los métodos disponibles en el Paginador class le permite crear una navegación simple en su página. Aquí hay un ejemplo que puede agregar debajo de su código HTML inicial:
{% si página.has_previous %}
<ahref="?page={{page.previous_page_number}}"
class="btn btn-secundario mx-NN">Anteriora>
{% terminara si %}<ahref="?página=1"clase="btn btn-secundario">Primeroa>
{% para num en page.paginator.page_range %}
{% si num == pagina.numero %}
<durar>{{ número }}durar>
{% demás %}
<ahref="?página={{núm}}"clase="btn btn-secundario mx-2">
{{ número }}
a>
{% terminara si %}
{% endfor%}<ahref="?page={{page.paginator.num_pages}}"clase="btn btn-secundario mx-2">
Último
a>
{% si la página.has_next%}
<ahref="?page={{page.next_page_number}}"clase="btn btn-secundario mx-2">
Próximo
a>
{% terminara si %}
En el fragmento de código anterior, los siguientes métodos se utilizan junto con declaraciones condicionales para determinar cómo se verá la navegación de paginación:
- tiene_anterior: Este método devuelve Verdadero si hay una página anterior en los datos paginados.
- número_página_anterior: Este método devuelve el valor de la página anterior.
- rango de páginas: este método le permite saber cuántas páginas tiene en sus datos paginados.
- número: Este método devuelve el valor de la página actual.
- núm_páginas: este método devuelve el número total de páginas.
- tiene_siguiente: Esta función devuelve Verdadero si hay una página siguiente en los datos paginados.
- siguiente_número_de_página: Este método devuelve el valor de la página siguiente.
Paginación de Django en una vista basada en clases
En una vista basada en clases, no tiene que importar e inicializar el Paginador clase. Para implementar la paginación en una vista basada en clases, debe especificar un atributo llamado paginar_por. Siga estos pasos para paginar su aplicación con una vista basada en clases:
- Escriba una vista basada en clases y especifique el paginar_por atributo. Aquí hay un ejemplo simple:
de .modelos importar Correo
de django.views.generic importar Vista de la lista
clasePostListView(Vista de la lista):
modelo = Publicar
template_name = 'blog/blog_list_view.html'
nombre_objeto_contexto = 'página'
paginar_por = 2
La vista anterior es la versión basada en clases de la vista basada en funciones escrita anteriormente. Esta vista hereda la de Django. Vista de la lista clase, utilizada para enumerar elementos. Define su lógica con atributos como modelo, Nombre de la plantilla, nombre_objeto_contexto, y paginar_por. El paginar_por el atributo determina cuántas publicaciones mostrar por página; en este caso, 2 puestos.
- Una vez que cree su vista, modifique su urls.py archivo para usarlo. Aquí hay un ejemplo simple:
de .puntos de vista importar PostListView
patrones de URL = [
camino('', PostListView.as_view(), nombre='vista de la lista'),
]
- Modifique su plantilla HTML para usar página_obj para la paginación.
{% si page_obj.has_previous %}
<ahref="?page={{page_obj.anterior_page_number}}"
class="btn btn-secundario mx-NN">Anteriora>
{% terminara si %}<ahref="?página=1"clase="btn btn-secundario">Primeroa>
{% para num en page_obj.paginator.page_range %}
{% si num == page_obj.number %}
<durarclase="página actual">{{ número }}durar>
{% demás %}
<ahref="?página={{núm}}"clase="btn btn-secundario mx-2">
{{ número }}
a>
{% terminara si %}
{% endfor%}<ahref="?page={{page_obj.paginator.num_pages}}"
class="btn btn-secundario mx-NN">
Último
a>
{% si la página.has_next%}
<ahref="?page={{page_obj.next_page_number}}"
class="btn btn-secundario mx-NN">
Próximo
a>
{% terminara si %}
A diferencia de la plantilla HTML para la vista basada en funciones, esta plantilla utiliza página_obj en lugar de página para representar el objeto de la página. Este es el comportamiento predeterminado para la paginación basada en clases en Django.
Utilice la paginación para hacer que su aplicación sea escalable
La paginación reduce la carga en su servidor/base de datos al obtener y mostrar subconjuntos de datos más pequeños a la vez. Con la paginación, el rendimiento de sus sitios web aumentará. Tus usuarios también tendrán una buena experiencia al usar tu aplicación.
Las vistas basadas en clases ahorran más tiempo y código en comparación con las vistas basadas en funciones, pero puede usar cualquiera según sus preferencias y las especificaciones del proyecto.