【发布时间】:2009-12-14 17:35:59
【问题描述】:
我正在尝试在ModelAdmin 上使用get_actions() 方法动态构建管理操作列表。每个动作都与另一个模型的特定实例相关,并且随着可能添加或删除新实例,我想确保动作列表反映这一点。
这是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))
(元组返回值的奇怪重复dict由Django docs for get_actions()解释。)
正如预期的那样,这会生成一个适当命名的管理操作列表,用于将Quality 外键批量分配给Package 对象。
问题是无论我选择哪个操作,相同的Quality 对象都会分配给选定的Packages。
我假设我使用 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)
【问题讨论】: