La pagination est une fonctionnalité courante et utile dans les applications web pour diviser un ensemble de données en pages distinctes, permettant de naviguer efficacement entre différentes pages. Dans cet article, nous allons explorer comment implémenter la pagination en Django avec des exemples pratiques.
Étape 1 : Créer notre Classe Article
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.CharField(max_length=150)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
published = models.BooleanField(default=False)
def __str__(self):
return self.title
Étape 2 : La Vue pour la Pagination
Pour commencer, importez le module Paginator de Django et configurez la vue pour diviser les données en pages.
from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from apps.models import Article
def get(request):
articles = Article.objects.all() # Récupération des articles
paginator = Paginator(articles, 5) # 5 articles par page
page_number = request.GET.get('page', 1) # Récupération de la page demandée ou de la première par défaut
try:
page_obj = paginator.get_page(page_number)
except PageNotAnInteger: # Affiche la première page si le numéro de page n'est pas valide
page_obj = paginator.page(1)
except EmptyPage: # Affiche la dernière page si le numéro de page est hors limite
page_obj = paginator.page(paginator.num_pages)
return render(request, 'paginations/page.html', {'page_obj': page_obj})
Explication :
paginator = Paginator(articles, 5) : Initialise la pagination avec 5 articles par page.
page_number = request.GET.get('page', 1) : Récupère le numéro de page dans l’URL. Si aucune page n’est spécifiée, par défaut, il utilise la page 1.
page_obj = paginator.get_page(page_number) : Récupère les articles pour la page actuelle.
PageNotAnInteger : Si le numéro de page n’est pas un entier (exemple : ?page=abc), on affiche la première page.
EmptyPage : Si le numéro de page est en dehors de la limite (exemple : ?page=100 pour une pagination de 10 pages), on affiche la dernière page.
Étape 3 : Afficher la Pagination dans le Template
Voici un template de pagination qui utilise page_obj pour afficher uniquement les éléments de la page actuelle. Les liens "First", "Previous", "Next", et "Last" permettent une navigation claire.
<div class="col-md-8">
<div class="pagination">
{% if page_obj.has_previous %}
<a href="?page=1">First</a>
<a href="?page={{ page_obj.previous_page_number }}">Previous</a>
{% endif %}
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">Next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">Last</a>
{% endif %}
</div>
</div>
Explications :
{% if page_obj.has_previous %} : Vérifie s'il existe une page précédente, et si oui, affiche le lien "First" (vers la première page) et "Previous" (vers la page précédente).
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }} : Affiche le numéro de la page actuelle et le nombre total de pages.
{% if page_obj.has_next %} : Vérifie s'il existe une page suivante, et si oui, affiche le lien "Next" (vers la page suivante) et "Last" (vers la dernière page).
Pour voir le code source, consultez le dépôt GitHub Voir le code source sur GitHub.