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 %}. بعد الحذف، لا توجد صفحة للعنصر يمكن الانتقال إليها، لذا يلزم تحديد success_url.

استخدم reverse_lazy() هناك، وليس reverse(). تُحتسب قيمة سمة الصنف عند استيراد views.py، قبل وجود المسارات، لذا يمنع reverse() المشروع من بدء التشغيل. أما reverse_lazy() فينتظر إلى حين استخدام عنوان URL.

challenge icon

التحدي

سهل

القالب jobs/job_confirm_delete.html جاهز. أنشئ الصفحة التي تظهر عند الضغط على Delete:

  • أنشئ JobDeleteView، وهو DeleteView لـ Job، بحيث يوجّه المتصفح إلى jobs:list بعد الحذف.
  • أضف مسارًا "jobs/<slug:slug>/delete/" باسم delete.

اضغط على «تشغيل»، وافتح وظيفة، ثم اضغط على «حذف» وأكّد العملية.

جرّب بنفسك

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