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، أو عنوان URL الذي تُرجعه get_absolute_url() للصف.

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

challenge icon

التحدي

سهل

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

  • عرضًا من نوع JobUpdateView، وهو UpdateView لـ Job، ويتضمن الحقول الخمسة نفسها الموجودة في JobCreateView.
  • مسارًا "jobs/<slug:slug>/edit/" باسم edit.

اضغط على Run، وافتح وظيفة، واضغط على 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