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 الحقول التي يُسمح للزائر بتغييرها.
التحدي
سهلتحتوي صفحات الوظائف الآن على رابط 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