Использование нескольких декораторов в urls.py в Django
У меня есть админ-миксин, который я использую, чтобы предотвратить кеширование и убедиться, что пользователи вошли в систему путем переопределения dispatch(). Это используется в моих взглядах на основе классов.
# mixins.py
from django.contrib.admin.views.decorators import staff_member_required
from django.utils.decorators import method_decorator
from django.views.decorators.cache import never_cache
class AdminPageMixin(object):
@method_decorator(never_cache)
@method_decorator(staff_member_required)
def dispatch(self, request, *args, **kwargs):
return super(AdminPageMixin, self).dispatch(request, *args, **kwargs)
# views.py
class SomeAdminView(AdminPageMixin, ListView):
Я сталкиваюсь с проблемой, когда пытаюсь запустить модульные тесты для SomeAdminView. Да, я знаю, что могу использовать тестовый клиент django для входа в систему, но я стараюсь не писать функциональные тесты. Вместо этого я бы хотел обернуть функциональность AdminPageMixin в один декоратор и вызвать этот декоратор в urls.py, вот так:
url(r'^myurl/$', decorator_wrapper(SomeAdminView.as_view()), name='some-admin-view'),
В качестве альтернативы я мог бы сделать это:
url(r'^myurl/$', never_cache(staff_member_required(SomeAdminView.as_view())), name='some-admin-view'),
но если бы я хотел добавить третий или четвертый декоратор, я бы обновил много строк в urls.py и повторил бы много кода.
Есть идеи, как создать эту обертку декоратора?
1 ответ
Совершенно противоречит духу CBV использование декораторов в URLconfs. Вместо этого используйте mixins, чтобы добавить функциональность непосредственно к dispatch
метод класса представления.