Eine View-Klasse
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 1 von 18.
In diesem Abschnitt erstellen wir eine Stellenbörse, deren Startseite wie alle bisherigen Ansichten eine funktionsbasierte Ansicht ist. Django lässt dich eine Ansicht auch als Klasse schreiben: Du leitest eine Unterklasse von View ab und fügst für jede HTTP-Methode eine Methode hinzu. Eine GET-Anfrage ruft get() auf, eine POST-Anfrage post().
from django.views import View
class RecipeCountView(View):
def get(self, request):
total = Recipe.objects.count()
return HttpResponse(f"{total} recipes")Die Methode erhält self, dann request, und gibt eine Antwort zurück, genau wie eine funktionsbasierte Ansicht. Eine Route benötigt eine Funktion, und .as_view() erstellt eine aus der Klasse: path("count/", views.RecipeCountView.as_view()). Bei jeder Anfrage erstellt diese Funktion ein neues Objekt der Klasse und ruft die passende Methode auf.
Eine Anfrage mit einer Methode, die die Klasse nicht definiert, etwa eine POST-Anfrage an diese Ansicht, erhält die Antwort 405 Method Not Allowed. Der Vorteil zeigt sich als Nächstes: Django liefert Klassen mit, die die gängigen Aufgaben bereits erledigen.
Aufgabe
EinfachVerwandle die Startseite in eine Klasse.
- Ersetze in
jobs/views.pydie FunktionhomedurchHomeView, eineView, derenget()das tut, washomegetan hat. - Verweise in
jobs/urls.pymit der Route""auf die Klasse. Behaltename="home"bei.
Drücke auf „Spielen“: Auf der Startseite steht weiterhin 12 jobs open.
Probier es selbst
from django.shortcuts import render
from .models import Job
def home(request):
count = Job.objects.count()
return render(request, "jobs/home.html", {"count": count})
Alle Lektionen in Klassenbasierte Views
Übe selbstständig: Django-Playground