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 %} הוא true רק בזמן עריכה. חובה לציין 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"]

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

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