Django - 将参数传递给 CBV 装饰器的正确方法?
Posted
技术标签:
【中文标题】Django - 将参数传递给 CBV 装饰器的正确方法?【英文标题】:Django - Correct way to pass arguments to CBV decorators? 【发布时间】:2016-03-01 10:11:35 【问题描述】:文档功能nice options for applying decorators such as login_required
to Class Based Views。
但是,我有点不清楚如何将特定参数与装饰器一起传递,在这种情况下,我想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'
【问题讨论】:
除了改变你使用装饰器的方式,你还需要反转登录url。当你在装饰器中使用它时,使用reverse_lazy
,即login_url=reverse_lazy("Accounts:account_login")
。
【参考方案1】:
你应该使用@method_decorator with class methods:
类上的方法与独立函数并不完全相同,所以 你不能只对方法应用一个函数装饰器——你需要 首先将其转换为方法装饰器。 method_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'
【讨论】:
我正在导入from django.utils.decorators import method_decorator
但此解决方案会产生错误:"TypeError: method_decorator() got an unexpected keyword argument 'name'
啊,我只需要更新到 Django 1.9!非常感谢。
如何在 Django 1.8 上做到这一点?
@alanjds 在 1.8 中有 method_decorator 但在文档中没有关于装饰类本身的能力的信息...尝试在类中装饰方法
已从 1.9 复制到本地 utils 模块。工作。我喜欢name
的一点是不必重写内部方法。还是谢谢。以上是关于Django - 将参数传递给 CBV 装饰器的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章