Menu
CoddyTech

إعادة التوجيه بعد 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).

challenge icon

التحدي

سهل

في 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