Использование нескольких декораторов в 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 метод класса представления.

Другие вопросы по тегам