Menu
CoddyTech

Перенаправление после POST

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

Добавьте событие, затем перезагрузите страницу благодарности: браузер предлагает отправить форму ещё раз, и если согласиться, событие добавится дважды. Страница отвечает на POST, поэтому при перезагрузке POST отправляется повторно.

Решение — шаблон Post/Redirect/Get. После сохранения представление отвечает перенаправлением: статусом 302 и новым адресом. Браузер открывает этот адрес с помощью GET, поэтому при перезагрузке повторяется только GET.

redirect() из django.shortcuts принимает имя URL, как и {% url %}. Например, магазин, который добавляет товар в корзину:

from django.shortcuts import redirect


def add_to_cart(request, pk):
    if request.method == "POST":
        CartItem.objects.create(product_id=pk)
        return redirect("shop:cart")
    ...

URL с аргументом принимает его по имени: redirect("shop:product", pk=7).

challenge icon

Задание

Легко

В new_event после создания мероприятия перенаправляй на страницу самого нового мероприятия вместо отображения event_added.html. Шаблон с благодарностью теперь не используется: удали его.

Нажми «Запустить», добавь мероприятие и перезагрузи страницу, на которую попадёшь.

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

from django.shortcuts import get_object_or_404, render

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":
        Event.objects.create(
            title=request.POST["title"],
            date=request.POST["date"],
            place=request.POST["place"],
        )
        return render(request, "events/event_added.html")
    return render(request, "events/new_event.html")

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

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