2009-07-21 5 views
6

Ich möchte eine E-Mail senden, wenn ein bestimmtes Feld in einem Modell geändert wird. Ist es möglich? Hier ist, was ich suche. Ich habe ein Profilmodell, das ein BooleanField enthält. Wenn der Administrator true wählt, möchte ich dem Benutzer eine E-Mail senden. Ich weiß, ich könnte es in ein "def save (Selbst):", aber das feuert eine E-Mail immer wenn das Modell geändert wird und das Feld ist wahr. Gibt es eine Möglichkeit, nur eine E-Mail zu erhalten, wenn das Feld von "False" zu "True" geändert wurde?Django - E-Mail senden bei Modellwechsel

Antwort

10

speichern Methode ist ein perfekt guter Ort für das, was Sie tun möchten:

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

Ich könnte die if-Anweisung, um diese Änderung: wenn nicht == self.field old.field: – ShawnMilo

+0

Er möchte E-Mails nur senden, wenn der Wert von False in True geändert wurde. Es ist nicht genug, zu überprüfen, ob die Werte nicht gleich sind. –

+0

War auf der Suche nach einer Möglichkeit, eine Aktion auszulösen, wenn ein Modell geändert wird ... sieht so aus. Vielen Dank. –

2

Sie können django-model-changes verwenden, um dies ohne eine zusätzliche Datenbanknachschlag zu tun:

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

das funktionierte wirklich gut für meine Anforderungen .. – Amistad

+0

Ich bin froh, dass es hilfreich war! –

0

Etwas Ähnliches könnte helfen, und sendet nur eine E-Mail, wenn eine Veränderung von false auf 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)