Menu
CoddyTech

حذف فعالية

جزء من قسم النماذج في رحلة Django على Coddy. الدرس 14 من 20.

الرابط هو طلب GET، ويجب ألا يغيّر طلب GET البيانات مطلقًا. تحمّل المتصفحات الروابط مسبقًا، وتفتحها تطبيقات الدردشة لعرض معاينة، وتتبع محركات البحث كل رابط تعثر عليه. والرابط الذي يحذف حدثًا سيحذفه دون أن يقرر أحد ذلك.

لذلك يتطلب التغيير خطوتين: يعرض طلب GET صفحة تطلب التأكيد، ثم ينفّذ طلب POST، الذي يُرسل بواسطة زر في نموذج، الإجراء. إليك تطبيق فوترة يضع علامة على فاتورة بأنها مدفوعة:

def pay_invoice(request, pk):
    invoice = get_object_or_404(Invoice, pk=pk)
    if request.method == "POST":
        invoice.paid = True
        invoice.save()
        return redirect("bills:invoice", pk=invoice.pk)
    return render(request, "bills/confirm_pay.html", {"invoice": invoice})

لا يحتاج نموذج التأكيد إلى حقول، بل إلى الرمز وزر فقط؛ فالنموذج الذي لا يحتوي على action يُرسل إلى الصفحة التي يوجد فيها. تحذف الدالة .delete() الصف. بعد الحذف، أعد التوجيه إلى صفحة لا تزال موجودة.

challenge icon

التحدي

سهل

رابط حذف هذا الحدث وصفحته جاهزان:

  • في delete_event، يعرض طلب GET الصفحة فقط. ويحذف طلب POST الحدث ثم يعيد التوجيه إلى قائمة الأحداث.
  • في delete_event.html، أضف نموذجًا يرسل البيانات إلى هذه الصفحة، مع زر Delete.

اضغط على Run، وافتح حدثًا، ثم احذفه.

جرّب بنفسك

from django.shortcuts import get_object_or_404, redirect, render

from .forms import EventForm
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":
        form = EventForm(request.POST)
        if form.is_valid():
            event = form.save()
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm()
    return render(request, "events/new_event.html", {"form": form})


def edit_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    if request.method == "POST":
        form = EventForm(request.POST, instance=event)
        if form.is_valid():
            form.save()
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm(instance=event)
    return render(request, "events/edit_event.html", {"form": form, "event": event})


def delete_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    # احذف الحدث فقط عند إرسال النموذج، ثم عُد إلى القائمة.
    return render(request, "events/delete_event.html", {"event": event})

جميع دروس النماذج

تدرّب بنفسك: Playground لـ Django