Python 更改电子邮件地址时发送电子邮件
在我的DJango应用程序中,我想实现一个系统,这样当我的jmodel中的Python 更改电子邮件地址时发送电子邮件,python,django,Python,Django,在我的DJango应用程序中,我想实现一个系统,这样当我的jmodel中的email字段发生更改时,MyModel会向该电子邮件地址发送一封电子邮件。我有一个我这个模型的模型。我应该如何实现这一点 我是否应该覆盖ModelForm的save()方法并将电子邮件发送到那里 我是否应该试着捕捉某种型号的更新信号并将电子邮件发送到那里?如果是,如何发送?我应该捕捉什么信号 检查电子邮件是否已更改的好方法是什么。这本身是一件很容易实现的事情,但我希望代码能够驻留在正确的位置 谢谢 检查字段是否已更改:我
email
字段发生更改时,MyModel
会向该电子邮件地址发送一封电子邮件。我有一个我这个模型的模型。我应该如何实现这一点
save()
方法并将电子邮件发送到那里检查字段是否已更改:我不会按照参考SO问题的建议进行操作。它得到了18张赞成票,但似乎反对票并不是一切;)。事实上,它可能只是日期信息(2009) 最好使用
pre_save
信号来执行此操作,这需要对您的模型进行绝对零的更改,因此不会产生任何负面后果,如您引用的答案
本质上,在receiver方法中,您可以从数据库中查找实例对象。由于这是预保存,数据库尚未更改。因此,您可以将instance.some_field
与obj.some_field
进行比较,看看它们是否不同
@receiver(pre_save, sender=MyModel)
def send_email_if_changed(sender, instance, **kwargs):
try:
obj = MyModel.objects.get(pk=instance.pk)
except MyModel.DoesNotExist:
pass # It's new, so email hasn't technically changed, but you might want to do something else here.
else:
if not obj.email == instance.email: # Email has changed
# send email
您可以使用来执行此操作,而无需额外的数据库查找:
from django.db import models
from django.dispatch import receiver
from django_model_changes import ChangesMixin
class MyModel(ChangesMixin, models.Model):
# your model
@receiver(pre_save, sender=MyModel)
def send_email_if_changed(sender, instance, **kwargs):
if 'email' in instance.changes():
# send email
选项1会将太多的行为耦合到模型中-发送电子邮件是该事件发生的副产品,但这不是模型需要了解的行为。您可以使用创建事件并设置此类行为的通知接收器。嗨,Chris,我正在实现这一点,但遇到了一个小问题。是否可以将电子邮件发送到新电子邮件地址,但不更新数据库中的电子邮件字段,即我想将旧电子邮件地址保存回数据库中。(我知道很多人不喜欢别人在评论中提问,但我觉得这与我一直试图实现的目标直接相关,因此我应该在这里提问。)谢谢克里斯。不,我认为这不可能。信号不会传回任何东西。他们只是根据自己的价值观做事。但是,你所描述的情况似乎是人为的。使用您实际试图完成的任务的信息修改您的问题。@MridangAgarwalla您可以调整我的答案以执行您想要的操作:覆盖
save
并调用self.changes()查看电子邮件是否更改,如果更改,您可以跳过调用super(MyModel,self).save()