Django-правильный способ передать аргументы CBV декораторам?


В docs есть хорошие возможности для применения декораторов, таких какlogin_required, к представлениям на основе классов .

Однако мне немного неясно, как передать конкретные аргументы вместе с декоратором, в этом случае я хотел бы Изменитьlogin_url декоратора .

Что-то вроде следующего, только действительного:

@login_required(login_url="Accounts:account_login")
@user_passes_test(profile_check)
class AccountSelectView(TemplateView):
    template_name='select_account_type.html'
1 2

1 ответ:

Вы должны использовать @method_decorator с методами класса:

Метод в классе не совсем то же самое, что автономная функция, поэтому вы не можете просто применить функцию декоратора к методу – вам нужно сначала превратите его в декоратора метода. В method_decorator декоратор преобразует декоратор функции в декоратор метода, так что что он может быть использован на методе экземпляра.

Затем просто вызовите decorator с аргументами, которые вам нужны, и передайте его метод decorator (вызывая функцию decorator, которая может принимать аргументы, вы получите фактический decorator на выходе). Не забудьте передать имя метода, который будет оформлен в качестве ключевого аргумента name (dispatch например) если вы украсите класс вместо самого метода класса:

@method_decorator(login_required(login_url="Accounts:account_login"),
                  name='dispatch')
@method_decorator(user_passes_test(profile_check), name='dispatch')
class AccountSelectView(TemplateView):
    template_name='select_account_type.html'