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.
Aufgabe
EinfachJobseiten haben jetzt einen Edit-Link. Erstelle die Seite dahinter:
- Eine
JobUpdateView, eineUpdateViewfürJobmit denselben fünf Feldern wieJobCreateView. - Eine Route
"jobs/<slug:slug>/edit/"mit dem Namenedit.
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
4Ansichten bearbeiten
CreateViewAuf der neuen Stelle landenÜbe selbstständig: Django-Playground