Миксины — небольшие классы, добавляющие одно поведение к CBV через множественное наследование.
Встроенные миксины
LoginRequiredMixin
from django.contrib.auth.mixins import LoginRequiredMixin
class TaskListView(LoginRequiredMixin, ListView):
model = Task
login_url = '/login/' # куда редиректить
redirect_field_name = 'next' # параметр для возврата
PermissionRequiredMixin
from django.contrib.auth.mixins import PermissionRequiredMixin
class TaskCreateView(PermissionRequiredMixin, CreateView):
model = Task
permission_required = 'tasks.add_task'
# или несколько прав:
permission_required = ['tasks.add_task', 'tasks.view_project']
UserPassesTestMixin
from django.contrib.auth.mixins import UserPassesTestMixin
class TaskEditView(UserPassesTestMixin, UpdateView):
model = Task
def test_func(self):
task = self.get_object()
return self.request.user == task.owner
Кастомный миксин
class OwnerRequiredMixin:
"""Разрешает доступ только владельцу объекта."""
def get_queryset(self):
qs = super().get_queryset()
return qs.filter(owner=self.request.user)
class TaskDetailView(LoginRequiredMixin, OwnerRequiredMixin, DetailView):
model = Task
Порядок наследования (MRO)
# Правильный порядок: миксины ПЕРЕД базовым классом
class TaskView(LoginRequiredMixin, OwnerRequiredMixin, DetailView):
...
# НЕправильно: базовый класс первым
class TaskView(DetailView, LoginRequiredMixin): # LoginRequired не сработает
...
Python использует C3 linearization — super() вызывает следующий класс в MRO слева направо.
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!