Короче говоря : базовый класс PermissionRequiredMixin
должен быть размещен перед базовым классом TemplateView
, так, чтобы MRO был правильным, и отправка указывает на переопределение PermissionRequiredMixin
.
A PermissionRequiredMixin
исправляет метод dispatch(..)
(хорошо, он добавляет дополнительную проверку, которая проверяет, есть ли у пользователя соответствующие разрешения).Здесь, однако, вы разместили подклассы в порядке, который приводит к тому, что функция dispatch(..)
является той из класса View
.
Действительно, если мы посмотрим на MRO, мы увидим:
>>> ViewName.__mro__
(<class 'ViewName'>, <class 'django.views.generic.base.TemplateView'>, <class 'django.views.generic.base.TemplateResponseMixin'>, <class 'django.views.generic.base.ContextMixin'>, <class <b>'django.views.generic.base.View'</b>>, <class <b>'django.contrib.auth.mixins.PermissionRequiredMixin'</b>>, <class 'django.contrib.auth.mixins.AccessMixin'>, <class 'object'>)
и если мы посмотрим на метод, который вызывается при вызове .dispatch(..)
, мы увидим:
>>> ViewName.dispatch
<function View.dispatch at 0x7f169e8f6620>
, чтобы позволить mixin переопределить оригинал.dispatch(..)
функция, нам нужно поместить ее сначала в базовые классы, например:
# PermissionRequiredMixin is put <i>before</i> TemplateView
class ViewName(<b>PermissionRequiredMixin, TemplateView</b>):
permission_required = 'accounts.action_all'
# ...
Затем мы видим, что:
>>> ViewName.__mro__
(<class 'ViewName'>, <class <b>'django.contrib.auth.mixins.PermissionRequiredMixin'</b>>, <class 'django.contrib.auth.mixins.AccessMixin'>, <class 'django.views.generic.base.TemplateView'>, <class 'django.views.generic.base.TemplateResponseMixin'>, <class 'django.views.generic.base.ContextMixin'>, <class <b>'django.views.generic.base.View'</b>>, <class 'object'>)
>>> ViewName.dispatch
<function <b>PermissionRequiredMixin.dispatch</b> at 0x7f168b41d620>