gpt4 book ai didi

django post_save 信号发送过时的内联表单集

转载 作者:行者123 更新时间:2023-12-04 02:19:54 33 4
gpt4 key购买 nike

考虑以下:

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)

最佳答案

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

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

关于django post_save 信号发送过时的内联表单集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4111679/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com