إعادة التوجيه بعد 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. يمكنك حذف 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