【发布时间】:2010-11-12 16:48:25
【问题描述】:
我想在模型中的特定字段发生更改时发送电子邮件。可能吗?这就是我要找的东西。我有一个包含 BooleanField 的配置文件模型,当管理员选择为 true 时,我想向用户发送电子邮件。我知道我可以把它放在“def save(self):”中,但是,只要模型改变并且字段为真,就会触发一封电子邮件。如果字段从 False 更改为 True,有没有办法让它只通过电子邮件发送?
【问题讨论】:
我想在模型中的特定字段发生更改时发送电子邮件。可能吗?这就是我要找的东西。我有一个包含 BooleanField 的配置文件模型,当管理员选择为 true 时,我想向用户发送电子邮件。我知道我可以把它放在“def save(self):”中,但是,只要模型改变并且字段为真,就会触发一封电子邮件。如果字段从 False 更改为 True,有没有办法让它只通过电子邮件发送?
【问题讨论】:
save 方法是您想要做的事情的绝佳选择:
def save(self):
if self.id:
old_foo = Foo.objects.get(pk=self.id)
if old_foo.YourBooleanField == False and self.YourBooleanField == True:
send_email()
super(Foo, self).save()
【讨论】:
您可以使用django-model-changes 来执行此操作,而无需额外的数据库查找:
from django.db import models
from django.dispatch import receiver
from django_model_changes import ChangesMixin
class MyModel(ChangesMixin, models.Model):
flag = models.BooleanField()
@receiver(pre_save, sender=MyModel)
def send_email_if_flag_enabled(sender, instance, **kwargs):
if instance.previous_instance().flag == False and instance.flag == True:
# send email
【讨论】:
这样的事情可能会有所帮助,并且只有在从 false 变为 true 时才会发送电子邮件
#models.py
from django.contrib.auth.models import User
from django.db.models import signals
from django.db import models
from django.dispatch import receiver
from django.db.models.signals import pre_save
from django.conf import settings
from django.core.mail import send_mail
#signal used for is_active=False to is_active=True
@receiver(pre_save, sender=User, dispatch_uid='active')
def active(sender, instance, **kwargs):
if instance.is_active and User.objects.filter(pk=instance.pk, is_active=False).exists():
subject = 'Active account'
mesagge = '%s your account is now active' %(instance.username)
from_email = settings.EMAIL_HOST_USER
send_mail(subject, mesagge, from_email, [instance.email], fail_silently=False)
【讨论】:
使用 django 信号 (http://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.post_save) 对模型 post_save 使用挂钩函数
在该功能中使用标准 django 邮件:http://docs.djangoproject.com/en/dev/topics/email/
【讨论】: