Eine View-Klasse
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 1 von 18.
In diesem Abschnitt erstellen wir eine Jobbörse, und ihre Startseite ist wie alle bisherigen Ansichten eine Funktionsansicht. Mit Django kannst du 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 nimmt self und dann request entgegen und gibt eine Antwort zurück, genau wie eine Funktionsansicht. 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 Methode, die die Klasse nicht definiert, wie hier POST, führt zu 405 Method Not Allowed. Der eigentliche Vorteil zeigt sich als Nächstes: Django liefert Klassen mit, die die gängigen Aufgaben bereits erledigen.
Aufgabe
EinfachWandle die Startseite in eine Klasse um:
- Ersetze in
jobs/views.pydie FunktionhomedurchHomeView, eineView, derenget()dasselbe tut wiehome. - Verweise in
jobs/urls.pymit der Route""auf die Klasse. Behaltename="home"bei.
Klicke auf „Run“: 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