更改电子邮件地址时发送电子邮件

时间:2011-10-28 15:28:21

标签: python django

在我的DJango应用程序中,我想实现一个系统,以便在我的jmodel email字段中更改MyModel时,会向该电子邮件地址发送一封电子邮件。我在这个模型上有一个ModelForm。我应该如何以及如何实现这个?

  1. 我应该覆盖模型形式的save()方法并在那里发送电子邮件吗?
  2. 我应该尝试尝试陷阱某种模型更新信号并在那里发送电子邮件 - 如果是这样,怎么样?我要诱捕什么信号?
  3. 检查电子邮件是否已更改的好方法是什么。这本身是一件很容易实现的事情,但我希望代码能够将它置于正确的位置。

    由于

    检查字段是否已更改:Django: When saving, how can you check if a field has changed?

2 个答案:

答案 0 :(得分:2)

您无需额外的数据库查找即可使用django-model-changes执行此操作:

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 :(得分:1)

我不会遵循引用的SO问题的建议。它有18个upvotes但它似乎upvotes不是一切;)。实际上,它可能只是日期信息(2009)。

使用pre_save信号执行此操作要好得多,这需要对模型进行绝对更改,因此不会产生任何负面影响,例如您引用的答案

基本上,在您的receiver方法中,您从数据库中查找实例对象。由于这是预先保存,因此数据库尚未更改。因此,您可以将instance.some_fieldobj.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