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 ответ:
Вы должны использовать @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'