Django-创建对象时发送电子邮件

Django-创建对象时发送电子邮件,django,Django,通常,为了在创建对象时发送电子邮件,我会覆盖save方法: def save(self, *args, **kwargs): send_email(context) return super().save(*args, **kwargs) 但是,我现在需要上下文来包含对象的一个属性,该属性在保存对象之前是未知的,即与模型对象关联的文件对象的url 我知道这可以通过post_save signal实现,但文档给人的印象是,当不同的模型需要访问此类信息时,最好使用这种方法。我得到的

通常,为了在创建对象时发送电子邮件,我会覆盖save方法:

def save(self, *args, **kwargs):
    send_email(context)
    return super().save(*args, **kwargs)
但是,我现在需要上下文来包含对象的一个属性,该属性在保存对象之前是未知的,即与模型对象关联的文件对象的url

我知道这可以通过post_save signal实现,但文档给人的印象是,当不同的模型需要访问此类信息时,最好使用这种方法。我得到的印象是,在这样的单一模型设置中使用它不是一个好的实践

我试过这个:

    foo = super().save(*args, **kwargs)
    send_email(foo.document.url)
    return foo

但是
foo
似乎是
None

save方法不返回任何内容。但是该项目是
self
,您可以在调用super后使用它

super().save(*args, **kwargs)
send_email(self.document.url)

save方法不返回任何内容。但是该项目是
self
,您可以在调用super后使用它

super().save(*args, **kwargs)
send_email(self.document.url)

Daniel的回答是正确的,但如果您只想在创建对象时发送电子邮件,而不想在对象更新时发送电子邮件,则还应检查实例是否分配了pk,例如:

def save(self, *args, **kwargs):
    created = self.pk is None
    super().save(*args, **kwargs)
    if created:
        send_email(context)

Daniel的回答是正确的,但如果您只想在创建对象时发送电子邮件,而不想在对象更新时发送电子邮件,则还应检查实例是否分配了pk,例如:

def save(self, *args, **kwargs):
    created = self.pk is None
    super().save(*args, **kwargs)
    if created:
        send_email(context)

您最好按照您所说的创建一个“post_save”信号,并选中“if created:”。您不需要
self.document.url
foo
只是
save
调用的结果。@squaregoldfish噢,是的,对不起,但self可能会引用类,而不是实际对象。我希望super().save(…)可能会返回已创建的对象,但显然不是…最好的方法是按照您所说的创建“post_save”信号,并选中“if created:”。您不需要
self.document.url
foo
只是
save
调用的结果。@squaregoldfish噢,是的,对不起,但self可能会引用类,而不是实际对象。我希望super().save(…)可以返回创建的对象,但显然不是…啊,好的。你会推荐这个而不是信号吗?其实没什么区别。不过我一般不太喜欢Python信号。啊,好的。你会推荐这个而不是信号吗?其实没什么区别。不过,我一般不太喜欢Python信号。