2013-07-16 36 views
1

我得到了一个模型,它在某些情况下保存时发出自定义信号。post_save从管理员调用,但m2m不保存

当我没有从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() 

我在以什么做亏本的那一刻,从长远来看,我是从使用管理这个任务搬走,因为这是一个有点笨重的一般工作流程,但直到我有时间,我只是想让它工作。

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

有什么建议吗?

+0

使用celery.contrib.rdb调试和找出究竟发生了什么 – mossplix

+0

特别是rdb的任何特殊原因?我已经通过与pdb的代码,但由于它没有引发任何异常,我不熟悉管理员的代码,我不知道该找什么。有什么建议么? 在这种情况下,我想要运行的是添加m2m关系,它在运行时获取输出。但没有反映在数据库上。 :x – gaqzi

回答

1

您可以在ModelAdmin覆盖save_related调用形式的save_m2m,如:

class FolderAdmin(admin.ModelAdmin): 
    form = FolderAdminForm 

    def save_related(self, request, form, formsets, change): 
     # Do my own fancy stuff 
+0

有时候,人们感觉比一叠砖块还要笨拙。当然,我可以做到这一点,因为我在全面考虑压倒一切。我厌倦了厌倦。 ;) – gaqzi

0

我被链接到this comment其中提到,它可能是问题的形式。保存后重置我的m2m字段的表单。

所以我做了一些挖掘并试图创建一个自定义的管理表单,可以做到这一点形成我。可悲的是,它似乎注定了;管理员不会在表单上提交。它采用表格,make it spit out an unsaved object。然后它takes that object,saves 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