2009-07-21 8 views
6

Chcę wysłać wiadomość e-mail, gdy określone pole zostanie zmienione w modelu. Czy to możliwe? Oto czego szukam. Mam model profilu, który zawiera BooleanField, który po wybraniu przez administratora, aby było prawdziwe Chcę wysłać użytkownika e-mail. Wiem, że mogę umieścić go w "def save (self):", ale to odpala e-mail, gdy tylko model zostanie zmieniony, a pole jest prawdziwe. Czy istnieje sposób, aby mieć tylko e-mail, jeśli pole zostało zmienione z Fałszywy na Prawdziwy?Django - wyślij wiadomość e-mail ze zmianą modelu

Odpowiedz

10

Zapisz metoda jest doskonale dobre miejsce dla tego, co chcesz zrobić:

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

mogę zmienić if do tego: jeśli nie old.field == self.field: – ShawnMilo

+0

Chce wysyłać wiadomości e-mail tylko wtedy, gdy wartość zmieni się z Fałsz na Prawda. Sprawdzenie, czy wartości nie są równe, nie wystarcza. –

+0

Szukał sposobu wyzwolenia jakiejkolwiek akcji po zmianie modelu ... wygląda na to, że to jest to. Dzięki. –

2

Możesz użyć django-model-changes, aby to zrobić bez dodatkowego wyszukiwania bazy danych:

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

to działało naprawdę dobrze dla moich wymagań .. – Amistad

+0

Cieszę się, że było pomocne! –

0

Coś takiego może pomóc i tylko wysyła wiadomość e-mail, gdy zmiana z false na 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)