2010-01-29 67 views
3

所以我有两个与ForeignKey相关的模型(表)。在管理员中,编辑页面显示第一个模型(假设ModelOne)以及第二个模型ModelTwo(TabularInline)的相关实例。内联模型形式发送post_save信号吗? (django)

我想要的是当第二个模型被改变时执行一些额外的操作。我可以在ModelTwo上使用post_save信号做到这一点。然而,post_save信号仅在我从其自己的编辑页面内保存模型(即不在ModelOne的内联中)时调用。

有没有办法在ModelTwo的内联表单上附加post_save信号?

...作为一种解决方法,我向ModelTwo添加了一些自定义验证,无论它是否内联,都会调用它),以调用我想要的方法。但是,由此设置引起的问题是,如果我正在创建ModelOne的新实例并同时创建ModelTwo的实例,则无法访问与此两个表相关的新实例的主键(外键)它还没有保存)。主键是我需要的东西。

我也尝试添加一个post_save信号ModelOne直接(这样我就可以得到新的实例的PK),但它似乎post_save信号不经过ModelTwo的数据(何必呢,反正?)

那么对此有什么解决方案?内联模型发出信号吗?有没有办法在保存之前访问新实例的PK?

回答

4

模型是模型。在管理界面中使用模型作为内联的事实不会以任何方式消除它。除非您覆盖其功能,否则所有型号都会发出后期保存信号。

Here is what happens when you save any model.

+1

是的,似乎后保存信号只发送时,实际保存的形式,即有新的数据进来或现有的数据已经改变。 – 2010-02-02 13:40:23

4

很多时候解决出现的时间与信号来解决,它最终被解决通过重写的各种保存方法之一更好。我已经通过重写两种方法之一有很多成功的在保存时注入额外的代码:

  1. Admin Object's save_model method
  2. Model's save method.

信号仍然是得心应手,但我只是在这两个地方有更好的运气。

+0

我的第一个链接 – Charlesliam 2014-01-24 01:13:42

+0

目前在[管理对象的save_model方法1.6](https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#django.contrib .admin.ModelAdmin.save_model)和[模型的保存方法1.6](https://docs.djangoproject.com/en/1.6/topics/db/models/#overriding-predefined-model-methods)。 – Charlesliam 2014-01-24 01:20:30

1

以上所有内容都是正确的,只需添加更多内容: 当您在admin(包含内联)保存对象时,内联的'保存后'信号(当然还有内联的保存方法对象)仅在您对内联对象进行了一些更改时触发。