有没有办法在模型中设置 Mixin Django Admin 操作参数?
Is there a way to set Mixin Django Admin action parameters within the model?
所以我有一个工作的 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
.
字段的子集
提前感谢您的任何想法!很抱歉,如果这个问题已经在其他地方被问过,我只是用不同的措辞。
您可以编写一个 returns 动作的工厂函数。这不需要混合。
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'
)]
所以我有一个工作的 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
.
提前感谢您的任何想法!很抱歉,如果这个问题已经在其他地方被问过,我只是用不同的措辞。
您可以编写一个 returns 动作的工厂函数。这不需要混合。
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'
)]