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 a opção de enviar o formulário novamente, e aceitar adiciona o evento duas vezes. Essa página foi a resposta a um POST, então recarregá-la envia o POST novamente.
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 repete apenas o GET.
redirect() de django.shortcuts recebe um nome de 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).
Desafio
FácilEm new_event, depois de criar o evento, redirecione para a página do próprio evento em vez de renderizar event_added.html. Você pode excluir event_added.html; nada mais o utiliza.
Adicione um evento e, em seguida, recarregue a página dele: o navegador não pede para enviar o formulário novamente.
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
1Formulários HTML
Um formulário de buscaUm formulário POSTRedirecionamento após POSTPratique por conta própria: Playground de Django