使用post_save信号处理程序访问新创建的模型实例的相关数据

问题描述

|| 通过管理面板创建
Entry
模型的新实例时,我需要发送电子邮件。所以在
models.py
我有
class Entry(models.Model):   
    attachments = models.ManyToManyField(to=Attachment,blank=True)
    #some other fields
    #...
    sent = models.BooleanField(editable=False,default=False)
然后,我是registring post_save处理函数
def send_message(sender,instance,**kwargs):
    if not instance.sent:
        #sending an e-mail message containing details about related attachments
        #...
        instance.sent = True
        instance.save()

post_save.connect(send_message,sender=Entry)  
它可以工作,但是正如我之前提到的,我还需要访问相关附件以在邮件中包含其详细信息。不幸的是,即使实际添加了附件,
instance.attachments.all()
也会在
send_message
函数中返回空列表。 如我所知,当发送post_save信号时,尚未保存已保存模型的相关数据,因此无法从该位置获取相关附件。 问题是:我是否可以使用信号或通过其他任何方式来完成此操作,还是必须将此电子邮件发送代码放在外面,例如,覆盖“ 0”模型的管理面板更改视图?     

解决方法

您应该能够通过重写ModelAdmin上的save_model()方法来执行此操作。您既可以在那儿发送电子邮件,也可以触发一个自定义信号,触发您的处理程序来发送电子邮件。 如果您有内联,我相信您需要使用save_formset()来代替。     ,也许您可以改用M2M更改信号? M2M字段更改时发送此信号。     ,我尝试使用shadfc建议的7ѭ
save_model()
方法。 无论如何,也不能从那里访问新更改的相关对象。但是
save_model
将填充的
form
作为参数,因此我使用了它。我的ѭ5不再用作信号处理程序,我添加了related_data参数。
def send_message(sender,instance,related_data={}):
    #sending e-mail using related_data parameter to access additional related objects
    #...
admin.py
中,我有:
class EntryAdmin(admin.ModelAdmin):
    def save_model(self,request,obj,form,change):
        obj.save()
        send_message(sender=Entry,instance=obj,related_data={\'attachments\': form.cleaned_data[\'attachments\']} )
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...