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.
Défi
FacileAfficher les offres 5 par page :
- Dans
JobListView, 5 lignes par page. - Dans
job_list.html, sous la liste, une<nav class="pages">avec un lienPrevious, le textePage 1 of 3(avec les vrais nombres) et un lienNext. 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