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