DeleteView
جزء من قسم واجهات العرض المعتمدة على الأصناف في رحلة Django على Coddy. الدرس 13 من 18.
تحتوي صفحات الوظائف على رابط Delete. يجب ألا يحدث الحذف مطلقًا بمجرد زيارة الصفحة: فالمتصفحات ومعاينات الروابط تفتح الصفحات تلقائيًا. لذلك تعمل DeleteView على خطوتين: يعرض GET سؤالًا، ولا يحذف إلا طلب POST المرسل من النموذج. موقع للوصفات:
from django.urls import reverse_lazy
class RecipeDeleteView(DeleteView):
model = Recipe
success_url = reverse_lazy("recipes:home")القالب الافتراضي له هو recipes/recipe_confirm_delete.html، وهو ملف تكتبه بنفسك. يحتوي على نموذج فيه method="post" و{% csrf_token %}، وزر يرسل طلب POST الذي ينفّذ الحذف. بعد الحذف، لا توجد صفحة للصف لتكون وجهة الانتقال، لذا يلزم تحديد success_url.
استخدم reverse_lazy() هنا، وليس reverse(). تُحتسب سمة الصنف عند استيراد views.py، قبل وجود المسارات، لذا يمنع reverse() المشروع من بدء التشغيل. أما reverse_lazy() فتنتظر حتى يُستخدم عنوان URL.
التحدي
سهلأنشئ الصفحة التي تظهر عند اختيار Delete، باستخدام القالب الجاهز jobs/job_confirm_delete.html.
- في
jobs/views.py، أضفJobDeleteView، وهوDeleteViewلـJob، بحيث يوجّه المتصفح إلىjobs:listبعد الحذف. - في
jobs/urls.py، أضف المسار"jobs/<slug:slug>/delete/"بالاسمdelete.
اضغط على «حذف» لإحدى الوظائف: ستظهر الصفحة أولًا لطلب التأكيد، وعند التأكيد ستُحذف الوظيفة من /jobs/.
جرّب بنفسك
from django.views.generic import CreateView, DetailView, ListView, TemplateView, UpdateView
from .models import Job
class HomeView(TemplateView):
template_name = "jobs/home.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["count"] = Job.objects.count()
context["latest"] = Job.objects.order_by("-posted").first()
return context
class AboutView(TemplateView):
template_name = "jobs/about.html"
class JobListView(ListView):
model = Job
context_object_name = "jobs"
ordering = ["-posted"]
paginate_by = 5
def get_queryset(self):
jobs = super().get_queryset()
city = self.request.GET.get("city")
if city:
jobs = jobs.filter(city=city)
return jobs
class JobDetailView(DetailView):
model = Job
class JobCreateView(CreateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
class JobUpdateView(UpdateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس واجهات العرض المعتمدة على الأصناف
تدرّب بنفسك: Playground لـ Django