Menu
CoddyTech

Удаление гостя

Часть раздела Формы путешествия по Django на Coddy. Урок 20 из 20.

Организатору нужно удалять людей со страницы гостей. Для каждой строки предусмотрена отдельная небольшая форма, атрибут action которой содержит URL именно для этой строки, поэтому кнопка отправляет данные только для своей строки. Список дел с кнопкой «Готово» для каждой задачи:

{% 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 %}

У представления вроде finish нет страницы: оно только выполняет действие. @require_POST из django.views.decorators.http отвечает кодом 405 на любой другой метод до запуска представления, поэтому ссылка или введённый вручную адрес никого не удалят:

@require_POST
def finish(request, pk):

После выполнения действия добавьте сообщение и перенаправьте пользователя, как и прежде.

challenge icon

Задание

Сложно
  • На странице гостей для каждого гостя есть кнопка Remove, которая отправляет POST-запрос на /rsvps/<pk>/remove/ (имя URL remove_rsvp).
  • Это представление принимает только POST-запросы. Оно удаляет RSVP, добавляет сообщение Ada was removed from the guest list. с именем гостя и перенаправляет на страницу гостей мероприятия.

Нажми «Запустить» и удали гостя.

Попробуйте сами

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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Формы

Потренируйтесь самостоятельно: Песочница Django