djangoのadmin画面で動的にactionを追加する
djangoにはadmin画面上で複数選択したアイテムを削除したり、アイテムの状態を変更するためのActionという機能がある
このActionを追加するよくある方法は下記の通り。
1 2 3 4 5 6 7 |
class AwesomeAdmin(admin.ModelAdmin): actions = ['awesome_action'] def awesome_action(self, request, queryset): # do something awesome_action.short_description = 'awesome action' |
actionsにメソッド名を詰めた配列を渡せばOK。
基本的には上記の方法で全く問題ない。
けど、似たような処理なんだがちょっとだけ違う処理を一気に定義したいときがある。
例えば、選択したアイテムに『◯◯』というタグを付与する操作ですかね。
『◯◯』が『イヌ』だったり『ネコ』だったりと付けたいタグ名は異なるが実装的にやってることはほとんど変わらないじゃないか、っていうヤツ。
先に挙げたよくある方法でタグ付けActionを実現しようとすると、チクチク関数を定義して、actionsにメソッド名を詰めないといけない。
まあ…コピペでも良いけど、ちょっと面倒です。
というわけで、Actionを配列にベタ書きせずに動的(表現として正しくない?)に追加する方法をインターネットで発見したのでメモしておく。
https://lukeplant.me.uk/blog/posts/dynamically-generated-django-admin-actions/
↑これ見れば終わり。
get_actionsというメソッドを拡張して、actionsにメソッドやらを含んだタプルを詰める。
Actionを生成する関数は別途用意してる。
イヌとネコのタグ付けActionをまとめてやる場合は下記の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
tag_list = ['dog', 'cat'] def get_actions(self, request): actions = super(AwesomeAdmin, self).get_actions(request) for tag in self.tag_list: action_name = 'add_' + tag action = self.__action(tag) actions[action_name] = ( action, action.__name__, action.short_description, ) return actions @staticmethod def __action(tag_name): def add_tag(modeladmin, _, queryset): for item in queryset.all(): item.tags.add(tag_name) add_tag.short_description = "Add {0} tag".format(tag_name) add_tag.__name__ = "add_{0}".format(tag_name) |
get_actionsで好きなように編集できるところが良い。
336px
336px
関連記事
-
-
PythonでEnumに状態を追加する
この …
- PREV
- 夏こそニットという選択
- NEXT
- 『誰がアパレルを殺すのか』を読んだ感想