Exercices Concepts Web & Django Réponse paginee avec Django
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Réponse paginee avec Django

La pagination, c'est le fait de decouper une grande liste en pages. Si tu as 100 articles, tu ne veux pas tout envoyer d'un coup au client. Tu envoies 10 éléments par page, et le client demande la page qu'il veut.

En Django, les paramètres d'URL comme ?page=2&per_page=10 sont accessibles via request.GET.

Le module math de Python fournit math.ceil() pour arrondir vers le haut, utile pour calculer le nombre total de pages.

Écris une fonction paginated_list_view(request, items) qui :
- Recupere le paramètre 'page' dans request.GET (défaut '1'), converti en int
- Recupere le paramètre 'per_page' dans request.GET (défaut '10'), converti en int
- Calcule le slice correct des items
- Retourne un JsonResponse avec les clés : data (les items de la page), page, per_page, total, total_pages, has_next, has_prev

Exemple :

from django.http import QueryDict
req = HttpRequest()
req.method = 'GET'
req.GET = QueryDict('page=2&per_page=5')
items = list(range(23))
resp = paginated_list_view(req, items)
La data contient [5, 6, 7, 8, 9], total_pages vaut 5

Tests (3/4)

Page 1 par défaut
import json
req = HttpRequest()
req.method = 'GET'
items = list(range(25))
resp = paginated_list_view(req, items)
data = json.loads(resp.content)
assert data['data'] == list(range(10)) and data['page'] == 1
Page 2 avec per_page=5
import json
req = HttpRequest()
req.method = 'GET'
req.GET = QueryDict('page=2&per_page=5')
items = list(range(23))
resp = paginated_list_view(req, items)
data = json.loads(resp.content)
assert data['data'] == [5, 6, 7, 8, 9] and data['total_pages'] == 5
has_next et has_prev
import json
req = HttpRequest()
req.method = 'GET'
req.GET = QueryDict('page=2&per_page=10')
items = list(range(25))
resp = paginated_list_view(req, items)
data = json.loads(resp.content)
assert data['has_next'] == True and data['has_prev'] == True

+ 0 tests cachés

Indices (3 disponibles)

solution.py