python / intermediate
Snippet
Django Generic Class-Based Views: ListView und DetailView
Djangos generische class-based Views bieten vorgebaute Funktionalität für häufige Muster. ListView behandelt Paginierung und Objektauflistung, während DetailView Objekte per Slug oder pk nachschlägt. LoginRequiredMixin fügt Authentifizierungsschutz hinzu. Diese reduzieren Boilerplate erheblich.
snippet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# views.pyfrom django.views.generic import ListView, DetailViewfrom django.contrib.auth.mixins import LoginRequiredMixinfrom .models import Postclass PostListView(LoginRequiredMixin, ListView):model = Posttemplate_name = 'blog/post_list.html'context_object_name = 'posts'paginate_by = 10def get_queryset(self):return Post.objects.filter(author=self.request.user).order_by('-created')class PostDetailView(DetailView):model = Posttemplate_name = 'blog/post_detail.html'context_object_name = 'post'slug_field = 'slug'query_pk_and_slug = True# urls.pypath('posts/', PostListView.as_view(), name='post_list'),path('post/<slug:slug>/', PostDetailView.as_view(), name='post_detail'),
django
Erklärung
1
class PostListView(LoginRequiredMixin, ListView):
Mehrfachvererbung: LoginRequiredMixin prüft Auth zuerst, dann bietet ListView Listenfunktionalität
2
paginate_by = 10
Teilt QuerySets automatisch in Seiten von je 10 Objekten auf
3
def get_queryset(self):
Überschreiben, um Posts auf die des aktuellen Benutzers zu filtern
4
query_pk_and_slug = True
Erlaubt DetailView Lookup nach Primärschlüssel oder Slug-Feld
5
PostDetailView.as_view()
Konvertiert die Klasse in eine aufrufbare View-Funktion für URL-Routing