Menu
CoddyTech

Tạo bằng POST

Thuộc phần API JSON trong hành trình Django của Coddy. Bài học 5 trên 19.

Chương trình có thể đọc các nhiệm vụ của bạn nhưng không thể thêm nhiệm vụ mới. Để tạo nhiệm vụ, chương trình gửi yêu cầu POST đến URL của danh sách, kèm nhiệm vụ dưới dạng JSON trong body của yêu cầu, phần dữ liệu được gửi cùng yêu cầu. Biểu mẫu điền dữ liệu vào request.POST, còn JSON thì không. Đọc phần nội dung thô bằng request.body rồi chuyển thành Python với json.loads.

Một URL có thể thực hiện hai việc, tùy theo request.method. View này chỉ phản hồi lại nội dung được gửi đến:

import json


def echo(request):
    if request.method == "POST":
        data = json.loads(request.body)
        return JsonResponse({"you_sent": data})
    return JsonResponse({"hint": "Send me a POST"})

View tạo một đối tượng sẽ phản hồi với 201 Created và đối tượng mới, để chương trình biết id của đối tượng đó.

Thanh địa chỉ chỉ gửi GET, nên bạn hãy gửi POST từ thẻ Shell. Client kiểm thử của Django gửi yêu cầu đến trang web của bạn bằng Python, còn .json() đọc phản hồi. Shell in kết quả dưới dạng từ điển Python: 'done': False, chứ không phải false của JSON.

challenge icon

Thử thách

Trung bình

Cho phép chương trình tạo một nhiệm vụ.

  1. Trong tasks/views.py, thêm import json. Ở đầu task_list, khi nhận POST, hãy tạo nhiệm vụ từ title và priority trong phần thân JSON (mặc định là normal).
  2. Trả về nhiệm vụ mới bằng task_to_dict với trạng thái 201. Giữ nguyên code GET bên dưới.

Chạy dòng bên dưới trong thẻ Shell: dòng này in ra Pay rent với mức ưu tiên normal.

from django.test import Client; print(Client().post("/api/tasks/", {"title": "Pay rent"}, content_type="application/json").json())

Tự làm thử

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.all()
    done = request.GET.get("done")
    if done == "true":
        tasks = tasks.filter(done=True)
    elif done == "false":
        tasks = tasks.filter(done=False)
    return JsonResponse([task_to_dict(task) for task in tasks], safe=False)


def task_detail(request, pk):
    task = Task.objects.filter(pk=pk).first()
    if task is None:
        return JsonResponse({"error": "Task not found"}, status=404)
    return JsonResponse(task_to_dict(task))
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong API JSON

Tự luyện tập: Playground Django