我正在尝试使用
以下是
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))
这个奇怪的重复元组字典返回值是由Django文档中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 get_actions(self, request): 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)) return dict(make_action(q) for q in models.Quality.objects.all())
- Andy Baker