Menu
CoddyTech

Kiểm tra đầu vào

Thuộc phần Biểu mẫu trong hành trình Django của Coddy. Bài học 4 trên 20.

Gửi biểu mẫu với tiêu đề trống, bảng sẽ nhận một sự kiện (event) không có tên. Vì request.POST có thể chứa bất kỳ dữ liệu nào, hàm xử lý kiểm tra dữ liệu trước khi lưu.

Khi đầu vào không hợp lệ, hàm xử lý không lưu gì và cũng không chuyển hướng: hàm hiển thị lại trang biểu mẫu cùng một thông báo. Biểu mẫu đặt bàn nhận từ 1 đến 8 khách:

guests = request.POST["guests"]
if not guests.isdigit() or not 1 <= int(guests) <= 8:
    problem = "Choose between 1 and 8 guests."
    return render(request, "tables/book.html", {"problem": problem})
Booking.objects.create(guests=int(guests))

Hãy kiểm tra trước khi gọi create(): sau khi hàng đã được lưu, thông báo sẽ không còn kịp nữa. Với văn bản, .strip() xóa khoảng trắng ở hai đầu, nên tiêu đề chỉ có khoảng trắng sẽ trở thành chuỗi rỗng. Mẫu chỉ hiển thị thông báo khi có thông báo:

{% if problem %}
<p class="warning">{{ problem }}</p>
{% endif %}
challenge icon

Thử thách

Dễ

Từ chối sự kiện nếu không có tiêu đề.

  1. Trong new_event ở events/views.py, khi tiêu đề để trống hoặc chỉ có dấu cách, không lưu gì và hiển thị lại trang biểu mẫu kèm thông báo Please give the event a title. Biểu mẫu có tiêu đề vẫn thêm sự kiện và chuyển hướng.
  2. Trong new_event.html, hiển thị thông báo phía trên biểu mẫu, chỉ khi có thông báo.

Gửi tiêu đề gồm ba dấu cách: bạn sẽ thấy Please give the event a title. và không có gì được lưu.

Tự làm thử

from django.shortcuts import get_object_or_404, redirect, render

from .models import Event


def event_list(request):
    q = request.GET.get("q", "")
    events = Event.objects.all()
    if q:
        events = events.filter(title__icontains=q)
    return render(request, "events/event_list.html", {"events": events, "q": q})


def event_detail(request, pk):
    event = get_object_or_404(Event, pk=pk)
    return render(request, "events/event_detail.html", {"event": event})


def new_event(request):
    if request.method == "POST":
        event = Event.objects.create(
            title=request.POST["title"],
            date=request.POST["date"],
            place=request.POST["place"],
        )
        return redirect("events:detail", pk=event.pk)
    return render(request, "events/new_event.html")
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 Biểu mẫu

Tự luyện tập: Playground Django