0

Django での一連の管理アクションの作成を自動化しようとしています。

基本的に、プロジェクト オブジェクトのステータス フィールドを一括変更できるようにしたいと考えています。status フィールドは ForeignkeyField です。

このようなクラスを作成するとうまくいくと思いました:

class StatusAction(object):

    def __init__(self,status):
         self.status = status

    def make_action(self, modeladmin, request, queryset):
        self.queryset = queryset.update(status=self.status)

    make_action.short_description = "Change status to '%s' for selected projects" % status

次に、次のようなアクションを宣言します。

actions = [StatusAction(s.id).make_action for s in Status.objects.all()]

2 つの問題が発生しています。

  • 管理インターフェイスで終了するアクションは 1 つだけです (最後に宣言されたもの)。
  • make_action.short_description 属性にはクラス スコープがあるため、インスタンスごとに固有にすることはできません。make_action に self.make_action.short_description を入れても機能しません。

また、クロージャー(関数内の関数)でこれを実行しようとしました。それは機能の問題の属性を解決しますが、それでも管理者には 1 つのアクションしかありません。

4

1 に答える 1

3

私が理解しているように、アクション関数には異なる名前が必要です。

def create_action(status):
    def action_func(modeladmin, request, queryset):
        print status
    action_func.__name__ = 'make_action_%d' % status.id
    action_func.short_description = "Change status to '%s' for selected projects" % status
    return action_func

actions = []
for s in Status.objects.all():
    actions.append(create_action(s))
于 2012-12-14T15:05:32.450 に答える