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 الحقول التي يُسمح للزائر بتغييرها.
التحدي
سهلتحتوي صفحات الوظائف الآن على رابط Edit. أنشئ الصفحة التي يفتحها هذا الرابط.
- في
jobs/views.py، أضفJobUpdateView، وهوUpdateViewلـJob، مع الحقول الخمسة نفسها الموجودة فيJobCreateView. - في
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