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
python
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