2009-07-21 13 views
6

Modelde belirli bir alan değiştirildiğinde e-posta göndermek istiyorum. Mümkün mü? İşte aradığım şey bu. Yöneticinin doğru olduğunu seçtiğinde kullanıcıya e-posta göndermek istediğim bir BooleanField içeren bir profil modelim var. Biliyorum ki "def def (self):" komutuna koyabilirdim, fakat bu model her değiştirildiğinde ve alan doğru olduğunda e-postayı iptal eder. Alanın False (Gerçek) değerinden True (Doğru) olarak değiştirilip değiştirilmesinin sadece bir yolu var mı? Django sinyalleri (http://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.post_save) o fonksiyonu kullanımı standardındaDjango - model değişikliğine e-posta gönder

kullanarak post_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() 

cevap

10

tasarruf yöntemi yapmak istediğim için gayet iyi bir yerdir django mailing: http://docs.djangoproject.com/en/dev/topics/email/

+0

Bunun için eğer deyimi değişebilir yalnızca bir e-posta gönderir olabilir: == self.field old.field değilse: – ShawnMilo

+0

Sadece değer False değerinden True olarak değiştirildiği zaman e-posta göndermek istiyor. Yani bu değerlerin eşit olmadığını kontrol etmek yeterli değildir. –

+0

Bir model değiştiğinde herhangi bir eylemi tetiklemek için bir yol arıyordu ... bunun gibi görünüyor. Teşekkürler. –

0

kullanın modellerinizden sahip bir işlev kanca:

+3

Post_save'de eski değere sahip olmayacaksınız, bu yüzden değerin gerçekten değişip değişmediğini bilmenin bir yolu olmazdı. –

2

django-model-changes'u ek bir veritabanı araması yapmadan yapmak için bunu kullanabilirsiniz:

Böyle
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

Bu gerçekten benim gereksinimleri için iyi çalıştı .. – Amistad

+0

Ben yardımcı oldu sevindim! –

0

şey yardımcı ve gerçek

yanlıştan değişiklik
#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)