Menu
CoddyTech

Pagination

Fait partie de la section Vues basées sur des classes du Journey Django de Coddy. Leçon 8 sur 18.

La page des offres d’emploi affiche tous les postes à la fois, et un millier ne tiendrait pas. La pagination répartit une liste en plusieurs pages reliées par des liens. Une ListView effectue cette répartition avec un seul attribut, paginate_by, qui indique le nombre de lignes par page.

Avec paginate_by = 20 pour une liste de recettes, /recipes/ affiche les 20 premières, /recipes/?page=2 les 20 suivantes, et une page au-delà de la dernière renvoie une erreur 404. La liste du modèle contient uniquement les lignes de cette page, et le modèle reçoit aussi is_paginated et page_obj, la page actuelle.

C’est à toi d’écrire les liens. page_obj connaît number, paginator.num_pages, has_next, next_page_number, has_previous et previous_page_number :

{% if page_obj.has_next %}
  <a href="?page={{ page_obj.next_page_number }}">More recipes</a>
{% endif %}

Garde la vérification autour de chaque lien : sur la dernière page, next_page_number déclenche une erreur qui fait planter la page.

challenge icon

Défi

Facile

Afficher les offres 5 par page :

  • Dans JobListView, 5 lignes par page.
  • Dans job_list.html, sous la liste, une <nav class="pages"> avec un lien Previous, le texte Page 1 of 3 (avec les vrais nombres) et un lien Next. Chaque lien s’affiche uniquement lorsque sa page existe.

Cliquez sur Exécuter, ouvrez /jobs/ et cliquez sur Next.

Essayez vous-même

from django.views.generic import DetailView, ListView, TemplateView

from .models import Job


class HomeView(TemplateView):
    template_name = "jobs/home.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["count"] = Job.objects.count()
        context["latest"] = Job.objects.order_by("-posted").first()
        return context


class AboutView(TemplateView):
    template_name = "jobs/about.html"


class JobListView(ListView):
    model = Job
    context_object_name = "jobs"
    ordering = ["-posted"]

    def get_queryset(self):
        jobs = super().get_queryset()
        city = self.request.GET.get("city")
        if city:
            jobs = jobs.filter(city=city)
        return jobs


class JobDetailView(DetailView):
    model = Job

Toutes les leçons de Vues basées sur des classes

Entraînez-vous par vous-même : Playground Django