Удаление гостя
Часть раздела Формы путешествия по 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):После выполнения действия добавьте сообщение и перенаправьте пользователя, как и прежде.
Задание
Сложно- На странице гостей для каждого гостя есть кнопка
Remove, которая отправляет POST-запрос на/rsvps/<pk>/remove/(имя URLremove_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})
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Формы
Потренируйтесь самостоятельно: Песочница Django