Améliorez l'efficacité et l'évolutivité de votre application Django en implémentant la pagination. Voici tout ce que vous devez savoir pour commencer.
La pagination améliore l'expérience utilisateur et les performances des applications lorsqu'il s'agit de grands ensembles de données. Sans système de pagination en place, votre application sera la plupart du temps en retard. Avec Django, vous pouvez tirer parti de la prise en charge intégrée de la pagination pour paginer votre application Web.
Comment fonctionne la pagination dans Django
L'implémentation de la pagination dans Django peut différer selon que vous travaillez avec des vues basées sur des classes ou des fonctions. Quelle que soit votre méthode préférée, les principes sous-jacents restent les mêmes.
Django utilise une classe appelée Paginateur pour implémenter la pagination. Le Paginateur La classe fournit plusieurs méthodes que vous pouvez utiliser pour personnaliser votre pagination. Lors de l'initialisation du Paginateur class, elle prend deux paramètres obligatoires; les données à paginer et le nombre d'éléments à afficher par page. Le
Paginateur prend un troisième paramètre facultatif pour les orphelins afin de spécifier le nombre minimum d'éléments qui doivent rester sur la dernière page. Par défaut, la valeur des orphelins est 0, ce qui signifie que toutes les pages ont le même nombre d'éléments.L'URL d'une page paginée Django ressemble à ceci: https://example.com/products/?page=3. Le page Le paramètre dans l'URL indique à Django quelle page l'utilisateur veut voir. Cela aide également Django à déterminer quelle partie des données afficher pour cette page.
Le code utilisé dans ce projet est disponible dans un Référentiel GitHub et est libre d'utilisation sous la licence MIT.
Configurez votre projet Django pour la pagination
Avant de paginer dans Django, vous devez avoir installé Django et configuré sur votre ordinateur. Après avoir configuré Django sur votre ordinateur, vous devez créer une application et un modèle pour vos données. Voici un modèle simple que vous pouvez copier :
depuis django.db importer des modèles
classePoste(des modèles. Modèle):
titre = modèles. CharField (max_length=255)
auteur = modèles. CharField (max_length=50)
contenu = modèles. Champ de texte('Publier un contenu')
définitivement__str__(soi):
retour auto.titre
Le modèle ci-dessus est pour une application de blog. Il définit les champs de titre, d'auteur et de contenu pour chaque article de blog. Il a également une méthode qui renvoie le titre du message pour une meilleure expérience utilisateur dans le panneau d'administration.
Migrez votre modèle en exécutant cette commande :
python manage.py makemigrations && python manage.py migrate
Après avoir migré votre modèle, vous devez accéder à blog>admin.py pour l'enregistrer. Le code suivant enregistre avec succès un modèle appelé Poste.
depuis django.contrib importer administrateur
depuis .des modèles importer Poste # remplacez 'Post' par le nom de votre modèle
admin.site.register (Publier)
Ensuite, créez un superutilisateur et ajoutez des messages dans votre panneau d'administration Django. Pour créer un superutilisateur, utilisez cette commande :
python manage.py crée un superutilisateur
La commande ci-dessus vous guidera tout au long du processus illustré dans l'image ci-dessous :
Après avoir créé un superutilisateur, exécutez votre serveur de développement et accédez au panneau d'administration.
serveur d'exécution python manage.py
Une fois votre serveur démarré, accédez à http://127.0.0.1:8000/admin, connectez-vous et ajoutez quelques messages.
Ensuite, créez un modèle HTML pour afficher vos messages sur le navigateur. Créez votre fichier dans le répertoire suivant: your_app/templates/your_app_name/index.html. Si vous ne comprenez pas comment créer des modèles, lisez notre guide d'introduction à l'architecture MVT de Django.
Pagination Django dans une vue basée sur les fonctions
Django vous permet de créer des applications avec des vues basées sur des classes ou des vues basées sur des fonctions. Pour paginer votre application à l'aide d'une vue basée sur les fonctions. Suivez ces étapes:
- Ouvrez votre vues.py fichier et importer le Paginateur classe.
depuis django.core.paginator importer Paginateur
- Créez une fonction d'affichage pour afficher les publications dans votre modèle HTML.
depuis django.raccourcis importer rendre
depuis .des modèles importer Poste
depuis django.core.paginator importer Paginateur
définitivementlist_view(demande):
posts = Post.objects.all()
retour rendre (demander, 'blog/blog_list_view.html', {'des postes':des postes})
- Créez un modèle d'URL pour afficher vos publications dans le navigateur. Commencez par configurer le modèle d'URL dans votre répertoire de projet. Ouvrez le urls.py fichier au niveau du projet et ajoutez-le au modèles d'URL :
depuis django.urls importer inclure
modèles d'url = [
...,
chemin('', inclure('blog.urls')),
]
Dans l'extrait de code ci-dessus, remplacez Blog avec le nom de votre application. Si vous ne pouvez pas faire la différence entre un projet et une application, vous devez savoir en quoi un projet diffère d'une application dans Django.
Après avoir effectué la configuration ci-dessus, créez un urls.py fichier dans le répertoire de votre application (dans ce cas, il s'agit du Blog dossier) et ajoutez cet extrait de code :
depuis django.urls importer chemin
depuis .vues importer list_view
modèles d'url = [
chemin('', list_view, nom='vue de liste'),
]
Lorsque vous exécutez votre serveur et accédez à http://127.0.0.1:8000/, le navigateur affichera vos publications selon la feuille de style que vous avez spécifiée.
- Modifiez votre fonction d'affichage pour ajouter une logique de pagination. Voici un exemple:
définitivementlist_view(demande):
posts = Post.objects.all()
paginated = paginateur (messages, 3)
numéro_page = demande. Obtenir('page') #Obtenir le numéro de page demandé à partir de l'URL
page = paginated.get_page (page_number)
retour rendre (demander, 'blog/blog_list_view.html', {'page':page})
L'extrait de code ci-dessus introduit trois nouvelles variables: paginé, numéro de page, et page. Chaque variable effectue les opérations suivantes :
- Le paginé variable a initialisé le Paginateur classe. Dans ce scénario, les données à paginer sont le jeu de requêtes, des postes, et il faut 3 comme le nombre d'éléments à afficher par page.
- Le numéro de page La variable obtient le numéro de page de l'URL. Par exemple, dans http://127.0.0.1:8000/?page=2, le numéro de page est 2.
- Le page La variable récupère la page spécifique à afficher à partir de la paginé variable.
A présent, Django doit avoir paginé votre page. Vous pouvez accéder à des pages paginées spécifiques à l'aide du format d'URL indiqué dans cette image :
- Modifiez votre modèle HTML pour afficher la navigation des pages paginées. En utilisant les méthodes disponibles dans le Paginateur class vous permet de créer une navigation simple sur votre page. Voici un exemple que vous pouvez ajouter sous votre code HTML initial:
{% si page.has_previous %}
<unhref="?page={{page.previous_page_number}}"
class="btn btn-secondaire mx-NN">Précédentun>
{% fin si %}<unhref="?page=1"classe="btn btn-secondaire">D'abordun>
{% for num in page.paginator.page_range %}
{% si num == page.numéro %}
<portée>{{ nombre }}portée>
{% autre %}
<unhref="?page={{num}}"classe="btn btn-secondaire mx-2">
{{ nombre }}
un>
{% fin si %}
{% endfor %}<unhref="?page={{page.paginator.num_pages}}"classe="btn btn-secondaire mx-2">
Dernier
un>
{% si page.has_next %}
<unhref="?page={{page.next_page_number}}"classe="btn btn-secondaire mx-2">
Suivant
un>
{% fin si %}
Dans l'extrait de code ci-dessus, les méthodes suivantes sont utilisées conjointement avec des instructions conditionnelles pour déterminer à quoi ressemblera la navigation de pagination :
- a_précédent: Cette méthode renvoie Vrai s'il y a une page précédente dans les données paginées.
- numéro_de_page_précédente: Cette méthode renvoie la valeur de la page précédente.
- intervalle de pages: Cette méthode vous permet de savoir combien de pages vous avez dans vos données paginées.
- nombre: Cette méthode renvoie la valeur de la page en cours.
- nombre_pages: Cette méthode renvoie le nombre total de pages.
- a_suivant: Cette fonction retourne Vrai s'il y a une page suivante dans les données paginées.
- numéro_de_page_suivante: Cette méthode renvoie la valeur de la page suivante.
Pagination Django dans une vue basée sur les classes
Dans une vue basée sur les classes, vous n'avez pas besoin d'importer et d'initialiser le Paginateur classe. Pour implémenter la pagination dans une vue basée sur les classes, vous devez spécifier un attribut appelé paginer_par. Suivez ces étapes pour paginer votre application avec une vue basée sur les classes :
- Écrivez une vue basée sur les classes et spécifiez le paginer_par attribut. Voici un exemple simple:
depuis .des modèles importer Poste
depuis django.views.générique importer AffichageListe
classePostListView(Vue Liste):
modèle = Poste
nom_modèle = 'blog/blog_list_view.html'
context_object_name = 'page'
paginate_by = 2
La vue ci-dessus est la version basée sur les classes de la vue basée sur les fonctions écrite précédemment. Cette vue hérite de Django AffichageListe classe, utilisée pour répertorier les éléments. Il définit sa logique avec des attributs tels que modèle, nom_modèle, context_object_name, et paginer_par. Le paginer_par l'attribut détermine le nombre d'articles à afficher par page; dans ce cas, 2 messages.
- Une fois que vous avez créé votre vue, modifiez votre urls.py fichier pour l'utiliser. Voici un exemple simple:
depuis .vues importer PostListView
modèles d'url = [
chemin('', PostListView.as_view(), nom='vue de liste'),
]
- Modifiez votre modèle HTML à utiliser page_obj pour la pagination.
{% si page_obj.has_previous %}
<unhref="?page={{page_obj.previous_page_number}}"
class="btn btn-secondaire mx-NN">Précédentun>
{% fin si %}<unhref="?page=1"classe="btn btn-secondaire">D'abordun>
{% for num in page_obj.paginator.page_range %}
{% si num == page_obj.number %}
<portéeclasse="page actuelle">{{ nombre }}portée>
{% autre %}
<unhref="?page={{num}}"classe="btn btn-secondaire mx-2">
{{ nombre }}
un>
{% fin si %}
{% endfor %}<unhref="?page={{page_obj.paginator.num_pages}}"
class="btn btn-secondaire mx-NN">
Dernier
un>
{% si page.has_next %}
<unhref="?page={{page_obj.next_page_number}}"
class="btn btn-secondaire mx-NN">
Suivant
un>
{% fin si %}
Contrairement au modèle HTML de la vue basée sur les fonctions, ce modèle utilise page_obj au lieu de page pour représenter l'objet page. C'est le comportement par défaut pour la pagination basée sur les classes dans Django.
Utilisez la pagination pour rendre votre application évolutive
La pagination réduit la charge sur votre serveur/base de données en récupérant et en affichant de plus petits sous-ensembles de données à la fois. Avec la pagination, les performances de vos sites Web augmenteront. Vos utilisateurs auront également une bonne expérience lors de l'utilisation de votre application.
Les vues basées sur les classes permettent d'économiser plus de temps et de code que les vues basées sur les fonctions, mais vous pouvez utiliser l'une ou l'autre en fonction de vos préférences et des spécifications du projet.