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.
التحدي
سهلالقالب 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"]
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس واجهات العرض المعتمدة على الأصناف
تدرّب بنفسك: Playground لـ Django