Menu
CoddyTech

UpdateView

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

Poster müssen ihre Jobs bearbeiten können. Eine Zeile zu bearbeiten bedeutet, eine zu erstellen, außer dass das Formular bereits ausgefüllt ist und beim Speichern die Zeile geändert wird, anstatt eine hinzuzufügen. 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 Zeile wird wie bei DetailView über den pk oder slug in der URL gefunden. Gibt es keine passende Zeile, wird 404 zurückgegeben. Nach dem Speichern führt es zum selben Ziel wie CreateView: zu success_url oder zur get_absolute_url() der Zeile.

Die Vorlage recipes/recipe_form.html wird mit CreateView gemeinsam genutzt. Die Zeile wird als object hinzugefügt, sodass {% if object %} nur beim Bearbeiten wahr ist. fields ist erforderlich: Django errät nicht, welche Felder ein Besucher ändern darf.

challenge icon

Aufgabe

Einfach

Die Jobseiten haben jetzt einen Link „Bearbeiten“. Erstelle die Seite, die sich dahinter verbirgt.

  1. Füge in jobs/views.py JobUpdateView hinzu, eine UpdateView für Job mit denselben fünf Feldern wie JobCreateView.
  2. Füge in jobs/urls.py die Route "jobs/<slug:slug>/edit/" mit dem Namen edit hinzu.

Öffne einen Job, klicke auf „Bearbeiten“ und speichere: Du landest wieder beim Job mit deiner Ä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