Formation incluse

Pagination avec Django – Guide et Exemples Pratiques

Priscille mande
Priscille mande
10 Numéro de téléphone 2024 · 4,89 min lecture
0
Django
Pagination avec Django – Guide et Exemples Pratiques

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 :

  1. {% 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).
  2. Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }} : Affiche le numéro de la page actuelle et le nombre total de pages.
  3. {% 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.

0

Applaudissez pour montrer votre soutien

Priscille mande

Priscille mande

3 Suivez-nous · Rédacteur pour Django

Je suis une jeune passionnée par le domaine de l'informatique, toujours prête à explorer de nouvelles technologies et à relever des défis.