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