Menu
CoddyTech

Chỉnh sửa sự kiện

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

Mỗi trang sự kiện giờ có liên kết Chỉnh sửa sự kiện này đến /events/1/edit/. URL, liên kết và mẫu đã sẵn sàng, còn edit_event đã tìm được sự kiện mà URL chỉ định. Phần còn lại của view là việc của bạn.

ModelForm chỉnh sửa một hàng hiện có khi bạn truyền hàng đó vào dưới dạng instance. Ví dụ với một ghi chú trong ứng dụng ghi chú:

note = get_object_or_404(Note, pk=4)

form = NoteForm(instance=note)                # điền sẵn các giá trị của ghi chú

form = NoteForm(request.POST, instance=note)  # các giá trị mới cho ghi chú này
if form.is_valid():
    form.save()                               # cập nhật ghi chú 4, không thêm hàng mới

Khi không có dữ liệu, NoteForm(instance=note) tạo biểu mẫu được điền sẵn các giá trị hiện tại của hàng. Khi có dữ liệu, instance=note khiến form.save() cập nhật hàng đó thay vì tạo hàng mới.

Trang chỉnh sửa cần cả hai. Nếu quên truyền instance trong GET, khách truy cập sẽ thấy biểu mẫu trống; nếu quên truyền instance trong POST, thao tác lưu sẽ thêm một bản sao.

challenge icon

Thử thách

Dễ

Hoàn thiện edit_event trong events/views.py bằng cách thay chú thích của nó. Lệnh gọi render() ở cuối đã truyền event; hãy thêm form bên cạnh.

  • Yêu cầu GET hiển thị biểu mẫu đã điền thông tin chi tiết của sự kiện.
  • POST hợp lệ lưu các thay đổi, không thêm sự kiện mới và chuyển hướng đến trang của sự kiện.
  • POST không hợp lệ hiển thị lại trang cùng các lỗi.

Đổi Place thành Town Hall rồi nhấn Save changes: trang sự kiện sẽ hiển thị Town Hall.

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):
    if request.method == "POST":
        form = EventForm(request.POST)
        if form.is_valid():
            event = form.save()
            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)
    # Tạo biểu mẫu cho sự kiện này, kiểm tra rồi lưu lại, tương tự new_event.
    return render(request, "events/edit_event.html", {"event": event})
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