Menu
CoddyTech

Xóa khách mời

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

Người tổ chức cần xóa mọi người khỏi trang khách mời. Mỗi hàng có một biểu mẫu nhỏ riêng, với action là URL của hàng đó, nên nút chỉ gửi dữ liệu của hàng tương ứng. Danh sách việc cần làm có nút Hoàn tất cho từng việc:

{% for task in tasks %}
<li>
    {{ task.title }}
    <form method="post" action="{% url 'todo:finish' task.pk %}">
        {% csrf_token %}
        <button type="submit">Done</button>
    </form>
</li>
{% endfor %}

Hàm như finish không hiển thị trang nào: hàm thay đổi dữ liệu rồi chuyển hướng. @require_POST, thuộc django.views.decorators.http, từ chối mọi yêu cầu khác với lỗi 405 Method Not Allowed, nên liên kết hoặc địa chỉ được nhập thủ công sẽ không xóa ai cả:

@require_POST
def finish(request, pk):

Sau khi xử lý, hãy thêm thông báo rồi chuyển hướng như trước.

challenge icon

Thử thách

Khó

Xóa một khách.

  1. Trong events/urls.py, thêm rsvps/<int:pk>/remove/ với tên remove_rsvp.
  2. Trong events/views.py, viết remove_rsvp với @require_POST (từ django.views.decorators.http). Hàm này xóa RSVP, thêm thông báo Ada was removed from the guest list. kèm tên khách và chuyển hướng đến trang khách.
  3. Trong guest_list.html, thêm biểu mẫu POST cho từng khách, có {% csrf_token %} và nút Remove gửi yêu cầu đến URL tương ứng.

Xóa Ada: chỉ còn Grace.

Tự làm thử

from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect, render

from .forms import EventForm, RSVPForm
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)
    if request.method == "POST":
        form = RSVPForm(request.POST, event=event)
        if form.is_valid():
            rsvp = form.save(commit=False)
            rsvp.event = event
            rsvp.save()
            messages.success(request, "You're on the list!")
            return redirect("events:detail", pk=event.pk)
    else:
        form = RSVPForm(event=event)
    return render(request, "events/event_detail.html", {"event": event, "form": form})


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})


def guest_list(request, pk):
    event = get_object_or_404(Event, pk=pk)
    return render(request, "events/guest_list.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