2009-07-21 16 views
6

Deseo enviar un correo electrónico cuando se cambia un campo específico en un modelo. ¿Es posible? Esto es lo que estoy buscando. Tengo un modelo de perfil que incluye un BooleanField que cuando el administrador selecciona que es verdadero, quiero enviar un correo electrónico al usuario. Sé que podría ponerlo en "def save (self):" pero, eso dispara un correo electrónico cada vez que se cambia el modelo y el campo es verdadero. ¿Hay alguna forma de tenerlo solo por correo electrónico si el campo fue cambiado de False a True?Django - enviar correo electrónico sobre el cambio de modelo

Respuesta

10

Guardar método es un perfecto lugar para lo que quieres hacer:

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() 
+0

que podría cambiar la sentencia if para esto: si no old.field == self.field: – ShawnMilo

+0

Quiere enviar un correo electrónico solo cuando el valor cambió de False a True. Entonces, verificar que los valores no sean iguales no es suficiente. –

+0

Estaba buscando una manera de activar cualquier acción cuando se cambia un modelo ... parece que es esto. Gracias. –

2

Puede usar django-model-changes para hacer esto sin una búsqueda de base de datos adicional:

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 
+0

esto funcionó muy bien para mis necesidades .. – Amistad

+0

¡Me alegra que haya sido útil! –

0

Algo como esto podría ayudar y sólo envía un correo electrónico cuando el cambio de falso a verdadero

#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) 
Cuestiones relacionadas