Menu
CoddyTech

Redirecionamento após POST

Parte da seção Forms do Journey de Django da Coddy. Lição 3 de 20.

Adicione um evento e, em seguida, recarregue a página de agradecimento: o navegador oferece reenviar o formulário e, se você aceitar, o evento será adicionado duas vezes. A página responde a um POST, então recarregá-la repete o POST.

A solução é um padrão chamado Post/Redirect/Get. Depois de salvar, a view responde com um redirecionamento: status 302 e um novo endereço. O navegador abre esse endereço com um GET, então recarregar a página repete apenas o GET.

redirect() de django.shortcuts recebe o nome de uma URL, assim como {% url %}. Uma loja que adiciona um item ao carrinho:

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")
    ...

Uma URL com um argumento recebe esse argumento pelo nome: redirect("shop:product", pk=7).

challenge icon

Desafio

Fácil

Em new_event, depois de criar o evento, redirecione para a própria página do novo evento em vez de renderizar event_added.html. O template de agradecimento não será mais usado: exclua-o.

Pressione Run, adicione um evento e recarregue a página em que você chegar.

Experimente você mesmo

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

Todas as lições de Forms

Pratique por conta própria: Playground de Django