Menu
CoddyTech

Удаление события

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

Ссылка использует GET, а GET никогда не должен изменять данные. Браузеры заранее загружают страницы по ссылкам, приложения для чатов открывают их, чтобы создать предварительный просмотр, а поисковые системы переходят по каждой найденной ссылке. Ссылка, которая удаляла бы событие, удалила бы его без чьего-либо решения.

Поэтому изменение выполняется в два шага: GET показывает страницу с запросом подтверждения, а POST, отправленный кнопкой в форме, выполняет действие. Приложение для выставления счетов, которое помечает счёт как оплаченный:

def pay_invoice(request, pk):
    invoice = get_object_or_404(Invoice, pk=pk)
    if request.method == "POST":
        invoice.paid = True
        invoice.save()
        return redirect("bills:invoice", pk=invoice.pk)
    return render(request, "bills/confirm_pay.html", {"invoice": invoice})

В форме подтверждения не нужны поля, только токен и кнопка; форма без action отправляет данные на страницу, на которой находится. Метод .delete() удаляет строку. После удаления перенаправьте пользователя на страницу, которая всё ещё существует.

challenge icon

Задание

Легко

Ссылка Delete this event и страница для неё готовы:

  • В delete_event запрос GET только отображает страницу. Запрос POST удаляет мероприятие и перенаправляет к списку мероприятий.
  • В delete_event.html добавь форму, которая отправляет запрос на эту страницу, с кнопкой Delete.

Нажми «Запустить», открой мероприятие и удали его.

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

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)
    if request.method == "POST":
        form = EventForm(request.POST, instance=event)
        if form.is_valid():
            form.save()
            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)
    # Удаляйте событие только после отправки формы, затем возвращайтесь к списку.
    return render(request, "events/delete_event.html", {"event": event})

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

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