django post_save信号发送过时的内联表单集

h3.*_*h3. 11 django django-signals django-models django-forms django-admin

考虑以下:

class OrderForm(models.Model):
    title = models.CharField(max_length=100)
    desc  = models.TextField()


class OrderFormLine(models.Model):
    order = models.ForeignKey(OrderForm)
    lagel = models.CharField(max_length=100)
    qty   = models.IntegerField(...)
    price = models.FloatField(...)
Run Code Online (Sandbox Code Playgroud)

现在,我想发送一封包含订单表格详细信息的电子邮件,无论何时有人创建或修改一个.

到目前为止还没有火箭科学..让我们只使用post_save信号;

post_save.connect(email_notify, sender=OrderForm)
Run Code Online (Sandbox Code Playgroud)

但是有一个小问题,传递给email_notify的OrderForm对象会按预期更新新数据,但不会更新相关的OrderFormLine项.

我试图覆盖管理员和模型中的保存方法,我试图保存对象,表单及其关系,然后将其传递给我的通知处理程序,没有任何作用.

我知道我可以将post_save信号附加到OrderItem模型,但随后会为每个项目发送电子邮件.

帮助我处于疯狂的边缘.

更新:

找到了简单可靠的解决方案

短篇故事:

def email_notify_orderform(sender, **kwargs):
    instance = kwargs['instance']
    ct = ContentType.objects.get_for_model(OrderForm)
    if ct.id == instance.content_type.id:
        print instance.is_addition()
        print instance.is_change()
        print instance.is_deletion()
        print instance.change_message
        print instance.action_time
        print instance.get_edited_object().total() # BINGO !
post_save.connect(email_notify_orderform, sender=LogEntry)
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 6

基本问题是当post_save发送主对象信号时,内联尚未保存:父模型总是先保存.所以,并不是它发送旧数据; 实际上它是数据的当前状态.

最简单的解决方案是创建自定义信号,并在保存内联的位置发送该信号.在save_formset对方法ModelAdmin是你的钩子.