Menu
CoddyTech

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.

challenge icon

التحدي

سهل

أنشئ الصفحة التي تظهر عند اختيار Delete، باستخدام القالب الجاهز jobs/job_confirm_delete.html.

  1. في jobs/views.py، أضف JobDeleteView، وهو DeleteView لـ Job، بحيث يوجّه المتصفح إلى jobs:list بعد الحذف.
  2. في 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"]
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس واجهات العرض المعتمدة على الأصناف

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