11

次のことを考慮してください。

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)

ただし、小さな問題が1つあります。それは、email_notifyに渡されたOrderFormオブジェクトが期待どおりに新しいデータで更新されますが、関連するOrderFormLineアイテムでは更新されないことです。

管理者とモデルのsaveメソッドをオーバーライドしようとしましたが、通知ハンドラーに渡す前に、オブジェクト、フォーム、およびその関係を保存しようとしましたが、何も機能しません。

post_saveシグナルをOrderItemモデルに添付できることは承知していますが、その後、アイテムごとにメールが送信されます。

私が狂気の瀬戸際にいるのを手伝ってください。

更新

シンプルで信頼できるソリューションを見つけました

ショートストーリー:

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)
4

1 に答える 1

6

基本的な問題は、メイン オブジェクトpost_saveシグナルが送信されたときに、インラインがまだ保存されていないことです。親モデルが常に最初に保存されます。したがって、古いデータを送信しているわけではありません。実際、それはデータの現在の状態です。

最も簡単な解決策は、カスタム シグナルを作成し、そのシグナルをインラインが保存されている場所に送信することです。save_formset方法はあなたのModelAdminフックです。

于 2011-05-11T20:05:39.167 に答える