0

私は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をdjango管理サイトis_leaderis_financelist_display要素として使いたいです。しかし今、これらのインスタンスメソッドは違法です。

これらのメソッドをどのように達成できますか?

部分的に使用する場合:

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がありますか?

4

1 に答える 1

1

selfを towrap()の定義に移動します。

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')
于 2012-08-19T04:10:45.723 に答える