Menu
CoddyTech

Chuỗi truy vấn

Thuộc phần Kiến thức cơ bản về Django trong hành trình Django của Coddy. Bài học 8 trên 23.

Trang đặt hàng luôn hiển thị cỡ vừa. Kích cỡ khách hàng chọn có thể nằm trong địa chỉ, sau dấu hỏi: /order/?size=large.

Phần đó là chuỗi truy vấn: các cặp name=value được nối với nhau bằng &. Nó không thuộc tuyến đường, vì vậy path("search/", ...) cũng khớp với /search/?q=cake. Khung nhìn đọc các cặp từ request.GET, hoạt động giống như một từ điển:

def search(request):
    word = request.GET.get("q", "")
    if len(word) > 30:
        word = word[:30]
    return HttpResponse(f"Results for {word}")

.get() nhận một giá trị mặc định khi thiếu tên; còn request.GET["q"] sẽ gây lỗi. Mọi giá trị đều đến dưới dạng văn bản, và bất kỳ ai cũng có thể nhập bất cứ thứ gì sau dấu ?, vì vậy hãy kiểm tra giá trị trước khi dùng. Để chỉ chấp nhận một số giá trị nhất định, hãy so sánh giá trị với danh sách các giá trị được phép và dùng giá trị mặc định cho những trường hợp khác.

challenge icon

Thử thách

Dễ

Hãy để trang đặt hàng đọc kích cỡ từ địa chỉ.

  1. Trong hàm xem order, đọc size từ request.GET để việc thiếu kích cỡ không gây lỗi.
  2. Với ?size=large, phản hồi bằng You ordered a large coffee. Đưa kích cỡ vào câu để small và medium cũng hoạt động.
  3. Với mọi kích cỡ khác hoặc không có kích cỡ, hãy đặt cà phê cỡ vừa.

Mở /order/?size=huge: bạn sẽ thấy You ordered a medium coffee.

Tự làm thử

from django.http import HttpResponse

DRINKS = {
    "espresso": {"name": "Espresso", "price": 2.5, "description": "A short, strong shot of coffee."},
    "latte": {"name": "Latte", "price": 3.5, "description": "Espresso with lots of steamed milk."},
    "flat-white": {"name": "Flat White", "price": 3.75, "description": "Espresso with a thin layer of silky milk."},
    "hot-chocolate": {"name": "Hot Chocolate", "price": 3, "description": "Dark chocolate melted into warm milk."},
}


def home(request):
    return HttpResponse("<h1>Welcome to Corner Café</h1><p>Fresh coffee and cake every day.</p>")


def about(request):
    return HttpResponse("Corner Café opened in 2026.")


def hours(request):
    return HttpResponse("Open every day from 8:00 to 18:00.")


def contact(request):
    return HttpResponse("Write to us at hello@cornercafe.example.")


def table(request, number):
    return HttpResponse(f"<h1>Table {number}</h1>")


def drink(request, slug):
    item = DRINKS[slug]
    return HttpResponse(f"<h1>{item['name']}</h1><p>{item['description']}</p>")


def order(request):
    size = "medium"
    return HttpResponse(f"You ordered a {size} coffee.")

Tất cả bài học trong Kiến thức cơ bản về Django

Tự luyện tập: Playground Django