PaginationLien vers cette rubrique

Django fournit quelques classes qui aident à effectuer de la pagination de données, c’est-à-dire des données qui sont partagées en plusieurs pages, avec des liens « Précédent/Suivant ». Ces classes se trouvent dans django/core/paginator.py.

ExempleLien vers cette rubrique

En donnant à Paginator une liste d’objets ainsi que le nombre d’éléments souhaités sur chaque page, cette classe vous offre des méthodes pour accéder aux éléments des différentes pages :

Code
>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)

>>> p.count
4
>>> p.num_pages
2
>>> type(p.page_range)
<class 'range_iterator'>
>>> p.page_range
range(1, 3)

>>> page1 = p.page(1)
>>> page1
<Page 1 of 2>
>>> page1.object_list
['john', 'paul']

>>> page2 = p.page(2)
>>> page2.object_list
['george', 'ringo']
>>> page2.has_next()
False
>>> page2.has_previous()
True
>>> page2.has_other_pages()
True
>>> page2.next_page_number()
Traceback (most recent call last):
...
EmptyPage: That page contains no results
>>> page2.previous_page_number()
1
>>> page2.start_index() # The 1-based index of the first item on this page
3
>>> page2.end_index() # The 1-based index of the last item on this page
4

>>> p.page(0)
Traceback (most recent call last):
...
EmptyPage: That page number is less than 1
>>> p.page(3)
Traceback (most recent call last):
...
EmptyPage: That page contains no results

Utilisation de Paginator dans une vueLien vers cette rubrique

Voici un exemple un peu plus complexe qui utilise Paginator dans une vue pour paginer un résultat de requête. Nous présentons à la fois la vue et le gabarit correspondant pour vous montrer comment afficher les résultats. Cet exemple part du principe qu’il existe un modèle Contacts qui a déjà été importé.

La fonction de vue ressemble à ceci :

Code
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.shortcuts import render

def listing(request):
    contact_list = Contacts.objects.all()
    paginator = Paginator(contact_list, 25) # Show 25 contacts per page

    page = request.GET.get('page')
    contacts = paginator.get_page(page)
    return render(request, 'list.html', {'contacts': contacts})

Dans le gabarit list.html, il est nécessaire d’inclure des éléments de navigation pour passer d’une page à l’autre, ainsi que des informations utiles sur les objets eux-mêmes :

Django template
{% for contact in contacts %}
    {# Each "contact" is a Contact model object. #}
    {{ contact.full_name|upper }}<br />
    ...
{% endfor %}

<div class="pagination">
    <span class="step-links">
        {% if contacts.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ contacts.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}.
        </span>

        {% if contacts.has_next %}
            <a href="?page={{ contacts.next_page_number }}">next</a>
            <a href="?page={{ contacts.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>

Objets PaginatorLien vers cette rubrique

Voici le constructeur de la classe Paginator :

class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)Lien vers cette définition

Paramètres obligatoiresLien vers cette rubrique

object_list

Une liste, un tuple, un QuerySet ou tout autre objet segmentable et doté d’une méthode count() ou __len__(). Pour une pagination cohérente, les QuerySet doivent être triés, par ex. avec une clause order_by() ou avec un tri par défaut ordering sur le modèle.

per_page

Le nombre maximum d’éléments à inclure dans une page, sans tenir compte des orphelins (voir le paramètre facultatif orphans ci-dessous).

Paramètres facultatifsLien vers cette rubrique

orphans

Utilisez ce paramètre lorsque vous ne souhaitez pas de dernière page avec très peu d’éléments. Lorsque la dernière page ne contient que le nombre orphans d’éléments ou moins, ces éléments sont alors ajoutés à la page précédente (qui devient la dernière page) au lieu de les laisser seuls sur une page. Par exemple, avec 23 éléments, per_page=10 et orphans=3, il y aura deux pages ; la première avec 10 éléments et la seconde (et dernière) avec 13 éléments. orphans vaut zéro par défaut, ce qui signifie que les pages ne sont jamais jointes et que la dernière page peut ne posséder qu’un seul élément.

allow_empty_first_page

Indique si la première page peut être vide. Avec la valeur False et une liste object_list vide, une erreur EmptyPage sera produite.

MéthodesLien vers cette rubrique

Paginator.get_page(number)Lien vers cette définition

Renvoie un objet Page correspondant à l’index number (commençant à 1), en gérant également les numéros de page non valides ou hors limites.

Si la page n’est pas un nombre, la première page est renvoyée. Si le numéro de page est négatif ou plus grand que le nombre de pages, c’est la dernière page qui est renvoyée.

Elle ne produit une exception (EmptyPage) seulement si vous indiquez Paginator(..., allow_empty_first_page=False) et que object_list est vide.

Paginator.page(number)Lien vers cette définition

Renvoie un objet Page correspondant à l’index number (commençant à 1). Si le numéro de page indiqué n’existe pas, une exception InvalidPage est levée.

AttributsLien vers cette rubrique

Paginator.countLien vers cette définition

Le nombre total d’objets sur toutes les pages.

Paginator.num_pagesLien vers cette définition

Le nombre total de pages.

Paginator.page_rangeLien vers cette définition

Une itération d’intervalle de numéros de pages commençant à 1, par ex. produisant [1, 2, 3, 4].

Exceptions InvalidPageLien vers cette rubrique

exception InvalidPageLien vers cette définition

Une classe de base pour les exceptions levées lorsqu’un paginateur reçoit un numéro de page non valable.

La méthode Paginator.page() lève une exception quand la page demandée n’est pas valable (par ex. ce n’est pas un nombre entier) ou quand elle ne contient aucun objet. Il est généralement suffisant d’intercepter l’exception InvalidPage, mais si vous souhaitez plus de finesse, vous pouvez intercepter l’une des exceptions suivantes :

exception PageNotAnIntegerLien vers cette définition

Levée lorsque page() reçoit une valeur qui n’est pas un nombre entier.

exception EmptyPageLien vers cette définition

Levée lorsque page() reçoit une valeur valable, mais que la page en question ne contient pas d’objet.

Ces deux exceptions sont des sous-classes de InvalidPage, il est donc possible de les intercepter par une simple ligne except InvalidPage.

Objets PageLien vers cette rubrique

Les objets Page ne sont normalement pas construits manuellement, mais plutôt obtenus en appelant Paginator.page().

class Page(object_list, number, paginator)Lien vers cette définition

Une page se comporte comme un liste de Page.object_list lorsqu’on lui applique len() ou qu’on effectue une itération sur elle.

MéthodesLien vers cette rubrique

Page.has_next()Lien vers cette définition

Renvoie True s’il existe une page suivante.

Page.has_previous()Lien vers cette définition

Renvoie True s’il existe une page précédente.

Page.has_other_pages()Lien vers cette définition

Renvoie True s’il existe une page suivante ou une page précédente.

Page.next_page_number()Lien vers cette définition

Renvoie le prochain numéro de page. Génère InvalidPage s’il n’y a pas de page suivante.

Page.previous_page_number()Lien vers cette définition

Renvoie le numéro de page précédent. Génère InvalidPage s’il n’y a pas de page précédente.

Page.start_index()Lien vers cette définition

Renvoie l’index (commençant par 1) du premier objet de la page, relatif à tous les autres objets de la liste du paginateur. Par exemple, lors de la pagination d’une liste de 5 objets par groupes de 2, la méthode start_index() de la deuxième page renverrait 3.

Page.end_index()Lien vers cette définition

Renvoie l’index (commençant par 1) du dernier objet de la page, relatif à tous les autres objets de la liste du paginateur. Par exemple, lors de la pagination d’une liste de 5 objets par groupes de 2, la méthode end_index() de la deuxième page renverrait 4.

AttributsLien vers cette rubrique

Page.object_listLien vers cette définition

La liste des objets de cette page.

Page.numberLien vers cette définition

Le numéro de page (commençant par 1) de cette page.

Page.paginatorLien vers cette définition

L’objet Paginator associé.