我正在尝试使用 get_actions()
动态构建管理操作列表ModelAdmin
上的方法。每个 Action 都与另一个模型的特定实例相关,并且随着新实例的添加或删除,我想确保 Action 列表反射(reflect)这一点。
这是 ModelAdmin
:
class PackageAdmin(admin.ModelAdmin):
list_display = ('name', 'quality')
def _actions(self, request):
for q in models.Quality.objects.all():
action = lambda modeladmin, req, qset: qset.update(quality=q)
name = "mark_%s" % (q,)
yield (name, (action, name, "Mark selected as %s quality" % (q,)))
def get_actions(self, request):
return dict(action for action in self._actions(request))
(元组返回值的奇怪重复字典由 Django docs for get_actions()
解释。)
正如预期的那样,这会生成一个适当命名的管理操作列表,用于将 Quality
外键批量分配给 Package
对象。
问题 是无论我选择哪个操作,相同的 Quality
对象都会分配给选定的 Package
。
我假设我用 lambda
关键字创建的闭包都包含对同一个 q
对象的引用,所以每次迭代都会更改 q 的值
用于每个函数。
我可以打破这个引用,让我仍然使用包含不同 q
值的闭包列表吗?
编辑:我意识到 lambda
在这个例子中不是必需的。而不是:
action = lambda modeladmin, req, qset: qset.update(quality=q)
我可以简单地使用 def
:
def action(modeladmin, req, qset):
return qset.update(quality=q)
最佳答案
尝试
def make_action(quality):
return lambda modeladmin, req, qset: qset.update(quality=quality)
for q in models.Quality.objects.all():
action = make_action(q)
name = "mark_%s" % (q,)
yield (name, (action, name, "Mark selected as %s quality" % (q,)))
如果这不起作用,我怀疑该错误与您对 yield
的使用有关。也许试试:
def make_action(quality):
name = 'mark_%s' % quality
action = lambda modeladmin, req, qset: qset.update(quality=quality)
return (name, (action, name, "Mark selected as %s quality" % quality))
def get_actions(self, request):
return dict([make_action for q in models.Quality.objects.all()])
关于python - Django 管理应用程序 : building a dynamic list of admin actions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1902332/