Une tâche par identifiant
Fait partie de la section API JSON du Journey Django de Coddy. Leçon 3 sur 19.
Un programme qui lisait la liste veut maintenant une tâche, à sa propre URL : /api/tasks/1/. La route récupère l’id avec <int:pk>, comme le faisaient tes pages de détail, et l’outil fourni task_to_dict(task) transforme une tâche en dictionnaire.
La nouveauté, c’est le cas où une tâche est introuvable. get_object_or_404 répond avec la page HTML 404 de Django, qu’un programme ne peut pas lire. Une API renvoie aussi les erreurs en JSON, avec le bon code d’état, le nombre qui indique comment s’est déroulée une requête : 200 OK, 403 Forbidden, 404 Not Found. JsonResponse le reçoit avec status :
return JsonResponse({"error": "Staff only"}, status=403)Pour choisir entre l’erreur et la tâche, recherche la ligne sans déclencher d’exception : filter(pk=...).first() renvoie la ligne, ou None s’il n’y en a pas.
Défi
FacileAjoutez le point de terminaison d’une tâche :
- Une vue
task_detail(request, pk)qui renvoietask_to_dict(task)au format JSON. - Pour un identifiant manquant, renvoyez
{"error": "Task not found"}avec le statut404. - La route
"api/tasks/<int:pk>/", nomméetask_detail.
Cliquez sur Run, puis ouvrez /api/tasks/1/ et /api/tasks/99/.
Essayez vous-même
from django.http import JsonResponse
from django.shortcuts import render
from .models import Task
def task_to_dict(task):
return {
"id": task.id,
"title": task.title,
"done": task.done,
"priority": task.priority,
}
def home(request):
return render(request, "tasks/home.html", {"tasks": Task.objects.all()})
def stats(request):
data = {
"total": Task.objects.count(),
"done": Task.objects.filter(done=True).count(),
}
return JsonResponse(data)
def task_list(request):
tasks = Task.objects.values("id", "title", "done", "priority")
return JsonResponse(list(tasks), safe=False)
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de API JSON
Entraînez-vous par vous-même : Playground Django