Menu
CoddyTech

UpdateView

Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 12 von 18.

Inserenten müssen ihre Stellenanzeigen bearbeiten können. Einen Datensatz zu bearbeiten bedeutet, einen Datensatz zu erstellen – nur ist das Formular bereits ausgefüllt, und beim Speichern wird der Datensatz geändert, statt ein neuer hinzugefügt zu werden. UpdateView erledigt beides. Eine Rezeptseite:

class RecipeUpdateView(UpdateView):
    model = Recipe
    fields = ["title", "cuisine", "minutes"]


# urls.py
path("recipes/<int:pk>/change/", views.RecipeUpdateView.as_view(), name="change")

Die View findet den Datensatz wie DetailView anhand des pk oder slug in der URL und gibt den Statuscode 404 zurück, wenn es keinen gibt. Nach dem Speichern leitet sie dorthin weiter, wohin auch CreateView weiterleitet: zu success_url oder zur URL des Datensatzes, die von get_absolute_url() zurückgegeben wird.

Die View verwendet gemeinsam mit CreateView die Vorlage recipes/recipe_form.html und fügt den Datensatz als object hinzu. Daher ist {% if object %} nur beim Bearbeiten wahr. fields ist erforderlich: Django kann nicht erraten, welche Felder ein Besucher ändern darf.

challenge icon

Aufgabe

Einfach

Jobseiten haben jetzt einen Edit-Link. Erstelle die Seite dahinter:

  • Eine JobUpdateView, eine UpdateView für Job mit denselben fünf Feldern wie JobCreateView.
  • Eine Route "jobs/<slug:slug>/edit/" mit dem Namen edit.

Klicke auf „Run“, öffne einen Job, klicke auf „Edit“ und speichere: Du landest wieder beim Job und siehst deine Änderung.

Probier es selbst

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

Alle Lektionen in Klassenbasierte Views

Übe selbstständig: Django-Playground