post_save从管理员调用,但m2m没有保存

时间:2013-07-16 08:24:29

标签: python django django-admin

我得到的模型在某些情况下会在保存时发出自定义信号。

当我没有从Django管理员更新我的项目时运行这个“post_save”工作正常,但是当我使用管理员更改它们时,我看到日志消息正在执行它应该做的所有事情。但它没有得救。

我看到this question说这是因为管理员使用了视图级锁定。所以我尝试运行transaction.commit()以及将@transaction.commit_manually添加到信号处理程序。遗憾的是,没有任何内容保存到数据库中。

更新:下面的m2m关系organisations未正确保存。没有异常或任何引发的东西,只是在通过管理员时不会被放入数据库。

我的参考处理程序:

@transaction.commit_manually  # tried this as both first and second decorator
@receiver(node_moved, sender=Folder)
def folder_moved_handler(sender, instance, **kwargs):
    transaction.commit_manually()
    transaction.commit()

    # When a folder was so moved it became root
    if instance.is_root_node():
        # Copy these organisations to the new root
        inherit_permissions_from = instance.inherit_permissions_from
        print inherit_permissions_from

        instance.inherit_permissions_from = None
        instance.save()
        set_inherited_permissions_descendents(instance, None)

        if inherit_permissions_from:
            for org in inherit_permissions_from.organisations_with_access:
                instance.organisations.add(org)
                print 'add org: {0}'.format(org)

    else:
        instance.inherit_permissions_from = get_who_to_inherit_from(instance)
        instance.save()

    print 'returning'
    print transaction.commit()

我现在正处理不知所措,从长远来看,我正在离开使用管理员执行此任务,因为它对于一般工作流程来说有点笨拙,但直到我有时间为此,我想让它发挥作用。

我唯一能想到的就是每隔一段时间设置一个标志并运行一个批处理作业。或者把它传递给芹菜,这不是目前的依赖。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可以覆盖调用表单save_related的{​​{1}}上的ModelAdmin,例如:

save_m2m

答案 1 :(得分:0)

我与this comment有联系,提到它可能就是形式问题。表单在保存后重置我的m2m字段。

所以我做了一些挖掘并尝试创建一个自定义管理表单,可以从我这样做。可悲的是,这似乎注定要失败;管理员不对表单进行提交。它采用make it spit out an unsaved object形式。然后是takes that objectsaves it,最后是takes the form objectsaves it

表单上的

save_m2m似乎不可覆盖。如果我understand the documentation正确save_m2m被动态添加,并且因为我的自定义表单没有停止任何我现在猜测是真的。

所以我现在要做的是添加一个警告,即我一直在尝试修复的不是管理员和自定义视图的链接。然后在未来完全为这部分应用程序构建管理员的需求。它并不意味着按照我可以想象的方式使用它。

所以在MC Hammer的不朽话语中; 无法触及此内容。

参考我的模型表格:

class FolderAdminForm(forms.ModelForm):
    def save_m2m(self):
        raise Exception('For the greater good') 

class FolderAdmin(admin.ModelAdmin):
    form = FolderAdminForm