حذف فعالية
جزء من قسم النماذج في رحلة 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() الصف. بعد الحذف، أعد التوجيه إلى صفحة لا تزال موجودة.
التحدي
سهلرابط حذف هذا الحدث وصفحته جاهزان:
- في
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