Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
Question 5 of 9 · Django Views & URL Routing
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.user

Mixins 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.user

Was this answer clear?