POST Sonrası Yönlendirme
Coddy'nin Django Journey'sinin Formlar bölümünün bir parçası. Ders 3 / 20.
Bir etkinlik ekleyin, ardından teşekkür sayfasını yeniden yükleyin: tarayıcı formu yeniden göndermeyi önerir ve kabul etmek etkinliği iki kez ekler. Sayfa bir POST isteğine yanıt verir, bu nedenle yeniden yüklemek POST isteğini tekrarlar.
Çözüm, Post/Redirect/Get adı verilen bir kalıptır. Kaydettikten sonra görünüm bir yönlendirme ile yanıt verir: 302 durum kodu ve yeni bir adres. Tarayıcı bu adresi bir GET isteğiyle açar, dolayısıyla yeniden yüklemek yalnızca GET isteğini tekrarlar.
django.shortcuts içindeki redirect(), {% url %} gibi bir URL adı alır. Sepete ürün ekleyen bir mağaza:
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")
...Argüman alan bir URL için argümanı adıyla belirtin: redirect("shop:product", pk=7).
Görev
Kolaynew_event içinde, etkinliği oluşturduktan sonra event_added.html dosyasını görüntülemek yerine yeni etkinliğin kendi sayfasına yönlendir. Böylece teşekkür şablonu kullanılmayacak: onu sil.
Çalıştır'a bas, bir etkinlik ekle ve açılan sayfayı yeniden yükle.
Kendin dene
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")
Formlar bölümündeki tüm dersler
Kendi başına pratik yap: Django playground