【问题标题】:Django - Correct way to pass arguments to CBV decorators?Django - 将参数传递给 CBV 装饰器的正确方法?
【发布时间】: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")

标签: python django django-class-based-views python-decorators django-generic-views


【解决方案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 的一点是不必重写内部方法。还是谢谢。
猜你喜欢
  • 2022-07-12
  • 2013-03-10
  • 2018-06-07
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 2021-11-21
  • 2018-08-24
  • 2014-10-01
相关资源
最近更新 更多