Menu
CoddyTech

Biểu mẫu đã gắn dữ liệu và chưa gắn dữ liệu

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

Gửi biểu mẫu với ngày next friday: trang tải lại nhưng trống, chỉ có thông báo "Please check the form." Lượt xem đã kiểm tra biểu mẫu chứa nội dung bạn nhập, sau đó loại bỏ nó và tạo một biểu mẫu mới, trống.

Biểu mẫu được tạo bằng dữ liệu là biểu mẫu đã liên kết: ContactForm(request.POST) chứa nội dung khách truy cập đã nhập và các lỗi sau khi gọi is_valid(). ContactForm() là biểu mẫu chưa liên kết: trống và không có lỗi. Khi hiển thị bằng {{ form }}, biểu mẫu đã liên kết hiển thị từng giá trị và lỗi bên cạnh trường không hợp lệ, chẳng hạn như Enter a valid date.

Vì vậy, một lượt xem có biểu mẫu sẽ có ba trường hợp:

  • Một GET: hiển thị biểu mẫu chưa liên kết.
  • Một POST không hợp lệ: hiển thị biểu mẫu đã liên kết mà lượt xem đã kiểm tra.
  • Một POST hợp lệ: lưu và chuyển hướng.

Một lệnh gọi render() ở cuối sẽ xử lý hai trường hợp đầu.

challenge icon

Thử thách

Dễ

Giữ lại nội dung khách truy cập đã nhập sau khi xảy ra lỗi.

  1. Trong new_event, hiển thị lại biểu mẫu bạn đã kiểm tra sau khi POST không thành công và hiển thị một EventForm trống khi nhận GET.
  2. Xóa thông báo error khỏi view và khỏi new_event.html: biểu mẫu giờ tự hiển thị các lỗi.

Nhập next friday làm ngày: tiêu đề của bạn vẫn được giữ lại và dòng Enter a valid date. xuất hiện phía trên ô Date.

Tự làm thử

from django.shortcuts import get_object_or_404, redirect, render

from .forms import EventForm
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):
    error = None
    if request.method == "POST":
        form = EventForm(request.POST)
        if form.is_valid():
            event = Event.objects.create(
                title=form.cleaned_data["title"],
                date=form.cleaned_data["date"],
                place=form.cleaned_data["place"],
            )
            return redirect("events:detail", pk=event.pk)
        error = "Please check the form."
    return render(request, "events/new_event.html", {"error": error, "form": EventForm()})
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