请考虑以下事项:
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(...)
现在,我想在有人创建或修改订单时,发送包含订单详细信息的电子邮件。
到目前为止还没有火箭科学..让我们只使用post_save信号;
post_save.connect(email_notify, sender=OrderForm)
但是有一个小问题,传递给email_notify的OrderForm对象会按预期更新新数据,但不会更新相关的OrderFormLine项。
我试图覆盖管理员和模型中的保存方法,我试图保存对象,表单及其关系,然后将其传递给我的通知处理程序,没有任何作用。
我知道我可以将post_save信号附加到OrderItem模型,但随后将为每个项目发送电子邮件。
帮助我处于疯狂的边缘。
更新:
Found a simple and reliable solution
短篇小说:
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)
答案 0 :(得分:6)
基本问题是,当发送主对象post_save
信号时,内联尚未保存:父模型总是先保存。所以,并不是它发送旧数据;实际上它是数据的当前状态。
最简单的解决方案是创建自定义信号,并在保存内联的位置发送该信号。 save_formset
上的ModelAdmin
方法就是你的钩子。