我正在开发一个django网站,想要定义一些像下面这样的实例方法。
Class Auth(models.Model):
def wrap_has_perm(self, perm):
def wrap():
if self.is_staff and self.has_perm(perm):
return True
else:
return False
can_add_order = wrap_has_perm('finance.normal')
can_review_order = wrap_has_perm('finance.review')
is_leader = wrap_has_perm('finance.leader')
is_finance = wrap_has_perm('finance.finance')
我想将can_add_order
,can_review_order
,is_leader
,is_finance
用作django管理站点的list_display元素。但是现在这些实例方法是非法的。(TypeError:wrap_has_perm()只需要2个参数(给定1个))
我如何实现这些方法?
如果我使用partial:
def staff_has_perm(self, perm):
return self.is_staff and self.has_perm(perm)
can_add_order = partial(staff_has_perm, perm='finance.normal')
can_review_order = partial(staff_has_perm, perm='finance.review')
is_leader = partial(staff_has_perm, perm='finance.leader')
is_finance = partial(staff_has_perm, perm='finance.finance')
它引发( * TypeError:staff_has_perm()只需要2个参数(给定1个));
我应该通过self
以及如何通过吗?
答案 0 :(得分:1)
将self
移至wrap()
的定义:
def wrap_has_perm(perm):
def wrap(self):
然而,更多Pythonic方法可能是使用functools.partial
:
from functools import partial
class Auth(models.Model):
def has_perm(self, perm):
# ...
can_add_order = partial(has_perm, perm='finance.normal')
can_review_order = partial(has_perm, perm='finance.review')
is_leader = partial(has_perm, perm='finance.leader')
is_finance = partial(has_perm, perm='finance.finance')