Menu
CoddyTech

Biểu mẫu xác nhận tham dự

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

Khách truy cập muốn cho biết họ sẽ đến. Dự án có mô hình RSVP mới với ForeignKey trỏ đến Event (related_name="rsvps"), và mỗi trang sự kiện có một biểu mẫu bên dưới tiêu đề Bạn sẽ đến chứ?

Biểu mẫu RSVP yêu cầu tên và email, không yêu cầu sự kiện: khách truy cập đang ở trang của sự kiện đó, còn một trường cho phép họ chọn sự kiện khác. Đừng thêm sự kiện vào fields, thay vào đó hãy đặt sự kiện trong view.

form.save(commit=False) tạo đối tượng mà chưa lưu, vì vậy bạn có thể thiết lập các phần còn lại trước. Biểu mẫu đặt hàng của cửa hàng không bao giờ hỏi về trạng thái:

form = OrderForm(request.POST)
if form.is_valid():
    order = form.save(commit=False)
    order.status = "new"
    order.save()

Lệnh gọi form.save() thông thường lưu hàng ngay lập tức, còn ForeignKey bắt buộc nhưng để trống sẽ gây lỗi IntegrityError.

challenge icon

Thử thách

Trung bình

Cho phép khách truy cập xác nhận tham dự.

  1. Trong events/forms.py, viết một ModelForm RSVPForm cho RSVP, chỉ gồm name và email.
  2. Trong event_detail, truyền RSVPForm cho trang dưới dạng form. Khi có POST, tạo biểu mẫu từ request.POST.
  3. Nếu hợp lệ, lưu với commit=False, đặt sự kiện cho biểu mẫu, lưu, thêm You're on the list! rồi chuyển hướng đến sự kiện. Nếu không hợp lệ, hiển thị lại biểu mẫu.

Xác nhận tham dự Friday Jazz Night: bạn sẽ thấy You're on the list!

Tự làm thử

from django.contrib import messages
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):
    if request.method == "POST":
        form = EventForm(request.POST)
        if form.is_valid():
            event = form.save()
            messages.success(request, "Your event was added.")
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm()
    return render(request, "events/new_event.html", {"form": form})


def edit_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    if request.method == "POST":
        form = EventForm(request.POST, instance=event)
        if form.is_valid():
            form.save()
            messages.success(request, "Your changes were saved.")
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm(instance=event)
    return render(request, "events/edit_event.html", {"form": form, "event": event})


def delete_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    if request.method == "POST":
        event.delete()
        messages.success(request, "The event was deleted.")
        return redirect("events:list")
    return render(request, "events/delete_event.html", {"event": event})

Tất cả bài học trong Biểu mẫu

Tự luyện tập: Playground Django