Menu
CoddyTech

DetailView

Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 5 von 18.

Jeder Eintrag braucht eine eigene Seite: Finde den Eintrag, zeige ihn an und gib 404 „Seite nicht gefunden“ zurück, wenn es keinen solchen Eintrag gibt. Dafür ist DetailView da. Auf einer Rezeptseite:

class RecipeDetailView(DetailView):
    model = Recipe


# urls.py
path("recipes/<int:pk>/", views.RecipeDetailView.as_view(), name="recipe")

Eine DetailView liest den Primärschlüssel der Zeile aus dem URL-Argument namens pk und sucht die Zeile auf dieselbe Weise wie get_object_or_404(). Die Vorlage ist standardmäßig recipes/recipe_detail.html, und die Zeile wird als object und als recipe bereitgestellt.

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 verlangt.

Ein Link übergibt den Primärschlüssel der Zeile an den Routennamen: {% url 'recipes:recipe' recipe.pk %}.

challenge icon

Aufgabe

Einfach

Gib jedem Job eine eigene Seite mit der fertigen Vorlage jobs/job_detail.html.

  1. Füge in jobs/views.py JobDetailView hinzu, eine DetailView für Job.
  2. Füge in jobs/urls.py die Route "jobs/<int:pk>/" mit dem Namen detail hinzu.
  3. Mache in job_list.html den Titel jedes Jobs zu einem Link zu seiner Seite.

Klicke auf Python Developer, um dessen Seite zu öffnen, und rufe dann /jobs/999/ auf: Du siehst „404 Page not found“.

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"]
quiz iconTeste dich selbst

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