1

我得到了一个模型,它在某些情况下会在保存时发出自定义信号。

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

我看到这个问题说这是因为管理员使用视图级别锁。所以我尝试运行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()

我目前不知道该怎么做,从长远来看,我将不再使用管理员来完成这项任务,因为它对于一般工作流程来说有点笨拙,但直到我有时间我只是想让它工作。

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

有什么建议么?

4

2 回答 2

1

您可以覆盖调用表单的save_relatedon ,例如:ModelAdminsave_m2m

class FolderAdmin(admin.ModelAdmin):
    form = FolderAdminForm

    def save_related(self, request, form, formsets, change):
         # Do my own fancy stuff
于 2013-07-16T14:53:20.343 回答
0

我与此评论相关联,该评论提到问题可能出在形式上。保存后重置我的 m2m 字段的表单。

所以我做了一些挖掘,并尝试创建一个自定义管理表单,可以让我这样做。可悲的是,它似乎注定要失败;管理员不会在表单上提交。它采取形式,让它吐出一个未保存的对象。然后它获取该对象保存它,最后获取表单对象保存它

save_m2mon form 似乎不可替代。如果我正确理解文档save_m2m是动态添加的,并且由于我的自定义表单没有停止任何事情,我现在猜测这是真的。

所以我现在要做的是添加一个警告,指出我一直在尝试修复的操作不适合管理员,并添加一个指向自定义视图的链接。然后在未来完全消除对应用程序这部分管理员的需求。它并不打算以我可以想象的方式使用。

所以在 MC Hammer 的不朽话语中;不能碰这个。

供参考我的模型形式:

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

class FolderAdmin(admin.ModelAdmin):
    form = FolderAdminForm
于 2013-07-16T12:43:29.763 回答