Menu
CoddyTech

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. Bu sayfa, bir POST isteğine verilen yanıttı; bu yüzden sayfayı yeniden yüklemek POST isteğini yeniden gönderir.

Çözüm, Post/Redirect/Get adı verilen bir kalıptır. Kaydettikten sonra görünüm bir yönlendirme yanıtı verir: 302 durum kodu ve yeni bir adres. Tarayıcı bu adresi bir GET isteğiyle açar; böylece sayfayı yeniden yüklemek yalnızca GET isteğini tekrarlar.

django.shortcuts içindeki redirect(), {% url %} gibi bir URL adı alır. Sepete bir ü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'de, argümanı adıyla belirtin: redirect("shop:product", pk=7).

challenge icon

Görev

Kolay

new_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. event_added.html dosyasını silebilirsin; artık onu kullanan hiçbir şey yok.

Bir etkinlik ekle, ardından sayfasını yeniden yükle: tarayıcı formu yeniden göndermeni istemez.

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