【问题标题】:Django - many to many with post_save gridlockDjango - 多对多与 post_save 僵局
【发布时间】:2012-07-22 16:13:08
【问题描述】:

我想在保存模型实例时发送一封电子邮件。为此,我会监听 post_save 信号:

#models.py
@receiver(post_save, sender=MyModel, dispatch_uid="something")
def send_email(sender, **kwargs):
    instance = kwargs['instance']
    email = ModelsEmailMessage(instance)  
    email.send()

在我看来,我会处理表单并将订阅者附加到对象:

#views.py
object = form.save()
object.subscribers.add(*users)

我的问题是表单保存在添加用户之前触发了 post_save 信号。

但如果我这样做:

object = form.save(commit=False)

那么我不能将 m2m 实例添加到没有 id 的对象。

嘿嘿!

【问题讨论】:

  • 所以subscribers 是一个m2m 字段,对吧?你不能只在模型的save()方法中发送电子邮件吗?
  • @scytale:不,您不能在模型 save() 中进行发送,因为 m2m 引用尚不存在。不会有订阅者,因此不会发送电子邮件。
  • @rantanplan:据我所知,m2m_changed 没有这样做,因为如果有人订阅或取消订阅,我不想给人们发邮件。我想在内容更改时发送邮件。如果我正确理解信号,如果有人进行了更改并且 m2m 没有更改,则不会发送信号。
  • 是的,这就是我支持 Rohan 的原因。您必须制作自定义信号。

标签: django django-forms django-signals m2m


【解决方案1】:

您很可能必须编写自己的信号来发送电子邮件。

虽然您实现了在保存对象时尝试发送电子邮件的事件,但这不是您想要的。您想在保存对象并在处理某些视图后添加一些 subscribers 时发送电子邮件。即它的两步操作。

【讨论】:

  • +1 罗汉是正确的。 OP 肯定需要自定义信号,因为只有他知道订阅者列表何时准备就绪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 2020-03-25
  • 2011-06-02
  • 2018-06-11
  • 2018-03-05
  • 1970-01-01
相关资源
最近更新 更多