在我的DJango应用程序中,我想实现一个系统,以便在我的jmodel email
字段中更改MyModel
时,会向该电子邮件地址发送一封电子邮件。我在这个模型上有一个ModelForm。我应该如何以及如何实现这个?
save()
方法并在那里发送电子邮件吗?检查电子邮件是否已更改的好方法是什么。这本身是一件很容易实现的事情,但我希望代码能够将它置于正确的位置。
由于
检查字段是否已更改:Django: When saving, how can you check if a field has changed?
答案 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_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