所以我有一個作業 Mixin 用于當前對查詢集的所有欄位進行操作的操作。而不是這個,我希望能夠通過管理頁面的代碼指定操作將使用哪些欄位。
對于背景關系,這是我的 Mixin 的簡短部分:
class MyMixin:
def my_action(self, request, queryset):
model_to_update = apps.get_model(
app_label=<my_app>,
model_name=queryset.first().__class__.__name__)
...
for field in model_to_update._meta.get_fields():
# do cool stuff with all fields
...
return render(...)
以下是當前合并 mixin 的方式:
...
@admin.register(<Model>)
class ModelAdmin(MyMixin):
...
actions = ["my_action"]
...
...而我想做的事情是:
...
@admin.register(<Model>)
class ModelAdmin(MyMixin):
...
actions = [my_action(fields=['foo', 'bar',]]
...
... 其中foo和bar是 的欄位的子集ModelAdmin。
提前感謝您的任何想法!抱歉,如果這已經在其他地方被問過,我只是用不同的措辭。
uj5u.com熱心網友回復:
您可以撰寫一個回傳操作的工廠函式。這不需要混合。
def action_factory(fields, description='some action'):
def my_action(self, request, queryset):
for field in fields:
# do cool stuff with fields and queryset
queryset.update(**{field:None})
my_action.short_description = description
return my_action
@admin.register(FooBar)
class FooBarAdmin(admin.ModelAdmin):
actions = [action_factory(
fields=['foo', 'bar'],
description='clear foo and bar'
)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/478234.html
標籤:python-3.x django
