Interview question
What are Django mixins and how do you use them with class-based views? Django mixins क्या हैं और class-based views के साथ इन्हें कैसे use करें?
Answer
Mixins are reusable classes that add specific behavior to a CBV through multiple inheritance, letting you compose functionality without duplicating code across views.
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views.generic import ListView, CreateView
# LoginRequiredMixin - restricts a view to authenticated users
class MyBooksView(LoginRequiredMixin, ListView):
model = Book
template_name = 'my_books.html'
login_url = '/login/' # where to redirect if not logged in
redirect_field_name = 'next'
def get_queryset(self):
return Book.objects.filter(owner=self.request.user)
# PermissionRequiredMixin - restricts to users with a specific permission
class BookCreateView(PermissionRequiredMixin, CreateView):
model = Book
fields = ['title', 'price']
permission_required = 'myapp.add_book'
# Mixin order MATTERS - Django resolves attributes/methods left to right (MRO)
# Mixins should generally come BEFORE the base generic view class
class SecureBookListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
model = Book
permission_required = 'myapp.view_book'
# Writing a CUSTOM mixin
class TitleMixin:
page_title = 'Default Title'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) # cooperative inheritance
context['page_title'] = self.page_title
return context
class BookListView(TitleMixin, ListView):
model = Book
page_title = 'All Books' # overrides the mixin's default
# UserPassesTestMixin - custom authorization logic
from django.contrib.auth.mixins import UserPassesTestMixin
class OwnerOnlyView(UserPassesTestMixin, DetailView):
model = Book
def test_func(self):
return self.get_object().owner == self.request.userMixins reusable classes हैं जो multiple inheritance से CBV में specific behavior जोड़ते हैं, code duplicate किए बिना functionality compose करने देते हैं।
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views.generic import ListView, CreateView
class MyBooksView(LoginRequiredMixin, ListView):
model = Book
template_name = 'my_books.html'
login_url = '/login/'
redirect_field_name = 'next'
def get_queryset(self):
return Book.objects.filter(owner=self.request.user)
class BookCreateView(PermissionRequiredMixin, CreateView):
model = Book
fields = ['title', 'price']
permission_required = 'myapp.add_book'
# Mixin order important है - MRO left से right
class SecureBookListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
model = Book
permission_required = 'myapp.view_book'
# Custom mixin लिखना
class TitleMixin:
page_title = 'Default Title'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['page_title'] = self.page_title
return context
class BookListView(TitleMixin, ListView):
model = Book
page_title = 'All Books'
from django.contrib.auth.mixins import UserPassesTestMixin
class OwnerOnlyView(UserPassesTestMixin, DetailView):
model = Book
def test_func(self):
return self.get_object().owner == self.request.userWas this answer clear?