Menu
CoddyTech

UpdateView

جزء من قسم واجهات العرض المعتمدة على الأصناف في رحلة Django على Coddy. الدرس 12 من 18.

يحتاج الناشرون إلى تعديل وظائفهم. تعديل صفّ يشبه إنشاء صف، لكن النموذج يكون مُعبّأً مسبقًا، وعند الحفظ يتغير الصف بدلًا من إضافة صف جديد. ينفذ UpdateView الأمرين. إليك موقعًا للوصفات:

class RecipeUpdateView(UpdateView):
    model = Recipe
    fields = ["title", "cuisine", "minutes"]


# urls.py
path("recipes/<int:pk>/change/", views.RecipeUpdateView.as_view(), name="change")

يجد الصف بالطريقة نفسها التي يستخدمها DetailView، عبر pk أو slug في عنوان URL، ويعرض خطأ 404 عندما لا يطابق أي صف. بعد الحفظ ينتقل إلى المكان نفسه الذي ينتقل إليه CreateView: إما success_url، أو get_absolute_url() الخاص بالصف.

يستخدم القالب recipes/recipe_form.html نفسه الذي يستخدمه CreateView، ويضيف الصف باسم object، لذا تكون {% if object %} صحيحة فقط عند التعديل. الخاصية fields مطلوبة: لن يخمّن Django الحقول التي يُسمح للزائر بتغييرها.

challenge icon

التحدي

سهل

تحتوي صفحات الوظائف الآن على رابط Edit. أنشئ الصفحة التي يفتحها هذا الرابط.

  1. في jobs/views.py، أضف JobUpdateView، وهو UpdateView لـ Job، مع الحقول الخمسة نفسها الموجودة في JobCreateView.
  2. في jobs/urls.py، أضف المسار "jobs/<slug:slug>/edit/" بالاسم edit.

افتح وظيفة، واضغط على «Edit» ثم احفظ: ستعود إلى صفحة الوظيفة بعد تطبيق التغيير.

جرّب بنفسك

from django.views.generic import CreateView, DetailView, ListView, TemplateView

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"]

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

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