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. צרו את הדף שמאחוריו:

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

כל השיעורים ביחידה תצוגות מבוססות מחלקות

תרגלו בעצמכם: Django אונליין