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 %}Thử thách
DễTừ chối sự kiện nếu không có tiêu đề.
- 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áoPlease give the event a title.Biểu mẫu có tiêu đề vẫn thêm sự kiện và chuyển hướng. - 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")
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