2

Документы функции nice options for applying decorators such as login_required to Class Based Views.Django - Правильный способ передать аргументы декораторам CBV?

Однако я немного не понимаю, как передать конкретные аргументы вместе с декоратором, в этом случае я хотел бы change the login_url of the decorator.

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

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

, а также изменить способ использования декоратор, вам необходимо изменить URL-адрес входа. Когда вы используете его в декораторе, используйте 'reverse_lazy', т. Е.' Login_url = reverse_lazy («Учетные записи: account_login») '. – Alasdair

ответ

2

Вы должны использовать @method_decorator with class methods:

A method on a class isn’t quite the same as a standalone function, so you can’t just apply a function decorator to the method – you need to transform it into a method decorator first. The method_decorator decorator transforms a function decorator into a method decorator so that it can be used on an instance method.

Тогда просто позвоните декоратор с аргументами, которые нужны и передать его в метод декоратора (с помощью вызова функции декоратора который может принимать аргументы, вы получите фактический декоратор при выходе). Не забудьте передать имя метода, который будет оформлен в качестве ключевого слова аргумент 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' 
+2

Я импортирую 'из django.utils.decorators import method_decorator', но это решение вызывает ошибку:' 'TypeError: method_decorator() получил неожиданный аргумент ключевого слова 'name'' –

+0

А, мне просто нужно обновить Django 1.9! Большое спасибо. –

+0

Как это сделать на Django 1.8? – alanjds