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.
Aufgabe
EinfachDie Jobseiten haben jetzt einen Link „Bearbeiten“. Erstelle die Seite, die sich dahinter verbirgt.
- Füge in
jobs/views.pyJobUpdateViewhinzu, eineUpdateViewfürJobmit denselben fünf Feldern wieJobCreateView. - Füge in
jobs/urls.pydie Route"jobs/<slug:slug>/edit/"mit dem Namenedithinzu.
Ö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
4Ansichten bearbeiten
CreateViewAuf der neuen Stelle landenÜbe selbstständig: Django-Playground