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 装饰器的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

将默认参数传递给python中的装饰器

如何在python中使用**kwargs作为装饰器的参数

将参数传递给要装饰的类方法的装饰器

将命令行参数传递给调用带有装饰器参数的装饰函数的函数

将参数传递给 decontext 装饰器

将附加参数传递给角度组件内的方法装饰器