python / intermediate
Snippet
Django Class-Based View Mixins for Reusable Logic
Mixins in Django class-based views allow you to compose reusable behaviors across multiple views. Django provides built-in mixins like LoginRequiredMixin, while custom mixins can encapsulate cross-cutting concerns like ownership verification. Python's method resolution order (MRO) handles multiple inheritance, calling mixins in right-to-left order.
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
Breakdown
1
from django.contrib.auth.mixins import LoginRequiredMixin
Import built-in mixin that redirects unauthenticated users to login page
2
class OwnerRequiredMixin:
Custom mixin class following Django CBV pattern for ownership checks
3
def get_object(self):
Override get_object to intercept object retrieval and add permission check
4
if obj.owner != self.request.user:
Compare object owner with current user, raise 403 if mismatch
5
class ProjectListView(LoginRequiredMixin, ListView):
Multiple inheritance: LoginRequiredMixin checked first, then ListView
6
def get_queryset(self):
Filter queryset to only show projects belonging to logged-in user
7
form.instance.owner = self.request.user
Assign owner in form_valid before saving to ensure ownership on create