11

考虑以下几点:Django的post_save信号发送过时的在线表单集

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(...) 

现在我想与orderform细节发送一封电子邮件,每当有人创建一个或修改之一。

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

post_save.connect(email_notify, sender=OrderForm) 

但是有一个小小的问题,传递给email_notify与预期新的数据更新OrderForm对象,但没有相关的OrderFormLine项目。我已经试图覆盖管理员和模型中的保存方法,我试图保存对象,表单和它的关系,然后将它传递给我的通知处理程序,没有任何工作。

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

帮助我处于疯狂的边缘。

UPDATE

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) 
+1

您必须保存订单,以便拥有与您的订单项关联的有效ID号。在我看来,定制信号是有序的;这可以使你免于疯狂。有时候,特殊情况不是邪恶的,这是一个非常小的特例。 “OrderForm”在完全实例化时发出信号,并且您的监听器等待而不是post_save。 – 2010-11-06 03:41:32

+0

我从来没有听说过编写自定义信号..我无法找到关于这个问题的很多内容。从我所了解的信号在django中紧密耦合在一起,并没有提供定制信号的机制。有记录吗? – 2010-11-06 03:52:00

+0

没关系,找到文档 – 2010-11-06 03:53:20

回答

6

最根本的问题是,当主要对象post_save信号发送后,内联都尚未保存:在父模型总是首先被保存。所以,这不是它发送旧数据;实际上这是数据的当前状态。

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

+0

除非有什么我不明白你的答案,它不起作用。您可以在博客文章中看到我尝试过的所有方法,包括使用save_formset:http://haineault.com/blog/141/ – 2011-05-12 12:34:36

+0

@ h3您是否明白了?这已经很长时间了,但你可以检查这个[post](http:// stackoverflow。com/questions/14858559/save-the-related-objects-before-the-actual-object-being-edited-on-django-admin)及其解决方案,说明如何使用[save_formset](https:// docs。 djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset)。我留下了评论,以防有人碰到这篇文章 – raratiru 2016-09-14 22:44:05