python / intermediate
Snippet
Django Klassenbasierte View Mixins für wiederverwendbare Logik
Mixins in Django klassenbasierten Views ermöglichen es Ihnen, wiederverwendbare Verhaltensweisen über mehrere Views hinweg zu komponieren. Django bietet eingebaute Mixins wie LoginRequiredMixin, während benutzerdefinierte Mixins domänenübergreifende Anliegen wie Eigentumsverifizierung kapseln können. Pythons Method Resolution Order (MRO) handhabt Mehrfachvererbung und ruft Mixins in Rechts-nach-Links-Ordnung auf.
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
26
27
28
29
30
31
32
33
34
from django.contrib.auth.mixins import LoginRequiredMixinfrom django.core.exceptions import PermissionDeniedfrom django.views.generic import ListView, CreateViewfrom .models import Projectclass OwnerRequiredMixin:"""Custom mixin to check object ownership"""def get_object(self):obj = super().get_object()if obj.owner != self.request.user:raise PermissionDenied("You don't own this object")return objclass ProjectListView(LoginRequiredMixin, ListView):model = Projectcontext_object_name = 'projects'template_name = 'projects/list.html'def get_queryset(self):return Project.objects.filter(owner=self.request.user)class ProjectCreateView(LoginRequiredMixin, CreateView):model = Projectfields = ['name', 'description']success_url = '/projects/'def form_valid(self, form):form.instance.owner = self.request.userreturn super().form_valid(form)class ProjectUpdateView(LoginRequiredMixin, OwnerRequiredMixin, CreateView):model = Projectfields = ['name', 'description']
django
Erklärung
1
from django.contrib.auth.mixins import LoginRequiredMixin
Importiere eingebautes Mixin das nicht-authentifizierte Benutzer zur Login-Seite weiterleitet
2
class OwnerRequiredMixin:
Benutzerdefiniertes Mixin nach Django CBV-Muster für Eigentumsprüfungen
3
def get_object(self):
Überschreibe get_object um Objektifzierung abzufangen und Berechtigungsprüfung hinzuzufügen
4
if obj.owner != self.request.user:
Vergleiche Objekt-Eigentümer mit aktuellem Benutzer, werfe 403 bei Missacht
5
class ProjectListView(LoginRequiredMixin, ListView):
Mehrfachvererbung: LoginRequiredMixin wird zuerst geprüft, dann ListView
6
def get_queryset(self):
Filtere Queryset um nur Projekte des eingeloggten Benutzers anzuzeigen
7
form.instance.owner = self.request.user
Weise Eigentümer in form_valid vor dem Speichern zu um Eigentum bei Erstellung sicherzustellen