DetailView
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 5 von 18.
Jeder Eintrag braucht eine eigene Seite: Finde die Zeile, zeige sie an und antworte mit 404, wenn es keine gibt. Das ist DetailView. Auf einer Rezept-Website:
class RecipeDetailView(DetailView):
model = Recipe
# urls.py
path("recipes/<int:pk>/", views.RecipeDetailView.as_view(), name="recipe")Ein DetailView liest den Primärschlüssel der Zeile aus dem URL-Argument namens pk und sucht die Zeile so, wie es get_object_or_404() tut. Das Template ist standardmäßig recipes/recipe_detail.html, und die Zeile kommt als object und als recipe an.
Der Name pk ist wichtig. Eine Route mit <int:id> übergibt der Ansicht ein Argument, nach dem sie nicht sucht, und die Seite stürzt mit einem AttributeError ab, der nach einem Objekt-Primärschlüssel oder einem Slug fragt.
Ein Link übergibt den Primärschlüssel der Zeile an den Routennamen: {% url 'recipes:recipe' recipe.pk %}.
Aufgabe
EinfachDie Vorlage jobs/job_detail.html ist bereit. Gib jedem Job eine eigene Seite:
- In
jobs/views.pyeineJobDetailView, eineDetailViewfürJob. - In
jobs/urls.pyeine Route"jobs/<int:pk>/"namensdetail. - Mache in
job_list.htmlden Titel jedes Jobs zu einem Link auf seine Seite.
Klicke auf Run, öffne /jobs/ und klicke auf einen Titel.
Probier es selbst
from django.views.generic import 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"]
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Klassenbasierte Views
Übe selbstständig: Django-Playground