إعادة التوجيه بعد POST
جزء من قسم النماذج في رحلة Django على Coddy. الدرس 3 من 20.
أضِف حدثًا، ثم أعد تحميل صفحة الشكر: سيعرض المتصفح إرسال النموذج مرة أخرى، والموافقة على ذلك تضيف الحدث مرتين. تستجيب الصفحة لطلب POST، لذا تؤدي إعادة التحميل إلى تكرار طلب POST.
الحل هو نمط يُسمى Post/Redirect/Get. بعد الحفظ، تستجيب طريقة العرض بإعادة توجيه redirect: رمز الحالة 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).
التحدي
سهلفي 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")
جميع دروس النماذج
تدرّب بنفسك: Playground لـ Django