2009-07-21 16 views
6

Desidero inviare un messaggio di posta elettronica quando un campo specifico viene modificato in un modello. È possibile? Ecco cosa sto cercando. Ho un modello di profilo che include un campo booleano che, quando l'amministratore seleziona true, desidero inviare un messaggio all'utente. So che potrei metterlo in un "def save (self):" ma, quello spara via un'e-mail ogni volta che il modello viene cambiato e il campo è vero. C'è un modo per avere solo e-mail se il campo è stato modificato da False a True?Django - invia e-mail sul cambio di modello

risposta

10

Salva metodo è perfettamente buon posto per quello che si vuole fare:

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

mi potrebbe cambiare l'istruzione if a questo: se non old.field == self.field: – ShawnMilo

+0

Vuole inviare email solo quando il valore è cambiato da False a True. Quindi controllare che i valori non siano uguali non è abbastanza. –

+0

Cercavo un modo per attivare un'azione quando un modello è cambiato ... sembra che sia così. Grazie. –

2

È possibile utilizzare django-model-changes per eseguire questa operazione senza una ricerca di database aggiuntiva:

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

questo ha funzionato davvero bene per le mie esigenze .. – Amistad

+0

Sono contento che sia stato utile! –

0

Qualcosa di simile potrebbe aiutare e invia una e-mail solo quando il cambiamento da false a 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)