python - Django 管理应用程序 : building a dynamic list of admin actions

标签 python django closures

我正在尝试使用 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/

相关文章:

循环内的 JavaScript 闭包——简单实用的例子

python - Django makemessages 不创建新添加的语言

javascript - 有什么惯用的方法可以在 Python 中向对象添加方法吗?

django - 如何让 Django View 返回表单错误

python - 运行时出现错误 "python manage.py check"

python - 如何测试 Django 电子邮件的内容?

python - 如何从用户输入中读取多个(可变长度)参数并将其存储在变量中并将其传递给函数

python - 加载json文件时如何将所有列表转换为集合

java - 了解 Spark 的闭包及其序列化

java - Groovy 中的闭包 - 用等效的 Java 实现