【问题标题】:django post_save signal sends outdated inline formsetsdjango post_save 信号发送过时的内联表单集
【发布时间】:2011-05-05 22:19:31
【问题描述】:

考虑以下几点:

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)

【问题讨论】:

  • 您必须保存订单才能获得与您的订单项相关联的有效 ID 号。在我看来,自定义信号是有序的;这可能会让你免于疯狂。有时,特例并不邪恶,这是一个非常小的特例。 “OrderForm”在完全实例化时发出信号,您的侦听器会等待它而不是 post_save。
  • 我从来没有听说过编写自定义信号......而且我找不到关于这个主题的太多信息。据我了解,信号在 django 中是紧密耦合的,并且没有提供自定义信号的机制。有记录吗?
  • 没关系,找到文档
  • 在这个问题上花了一晚上的时间......它并没有真正解决我的问题,因为我无法在保存过程的正确步骤附加信号。
  • @h3:您在博客中发布的所有这些案例都发生在保存内联之前?也许它们已保存,但您仍在使用尚未添加任何相关对象的OrderForm 实例。

标签: django django-models django-admin django-forms django-signals


【解决方案1】:

基本问题是当发送主对象post_save 信号时,内联还没有被保存:总是先保存父模型。所以,它不是在发送旧数据,而是在发送旧数据。实际上是数据的当前状态。

最简单的解决方案是创建一个自定义信号并将该信号发送到已保存内联的位置。 ModelAdmin 上的 save_formset 方法是你的钩子。

【讨论】:

  • 除非我对您的回答有什么不明白的地方,否则它不起作用。您可以在博客文章中看到我尝试过的所有方法,包括使用 save_formset:haineault.com/blog/141
  • @h3 你明白了吗?已经很长时间了,但您可以查看此post 及其说明save_formset 使用的解决方案。我留下评论以防有人碰到这篇文章
猜你喜欢
  • 2011-01-10
  • 2012-05-31
  • 2012-01-29
  • 1970-01-01
  • 2020-04-08
  • 2021-11-26
  • 2020-09-28
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多