2009-07-21 31 views
6

Tôi muốn gửi email khi một trường cụ thể được thay đổi trong một mô hình. Có thể không? Đây là những gì tôi đang tìm kiếm. Tôi có một mô hình hồ sơ bao gồm một BooleanField rằng khi người quản trị chọn là đúng, tôi muốn gửi cho người dùng một email. Tôi biết tôi có thể đặt nó trong một "def save (self):" nhưng, điều đó sẽ kích hoạt email bất cứ lúc nào mô hình được thay đổi và trường là đúng. Có cách nào để có nó chỉ email nếu lĩnh vực đã được thay đổi từ False thành True?Django - gửi email về thay đổi mô hình

Trả lời

10

tiết kiệm phương pháp là một nơi hoàn toàn tốt cho những gì bạn muốn làm:

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

tôi có thể thay đổi câu lệnh if như sau: nếu không old.field == self.field: – ShawnMilo

+0

Anh ấy chỉ muốn gửi email khi giá trị thay đổi từ False thành True. Vì vậy, kiểm tra các giá trị không bằng nhau là không đủ. –

+0

Đã tìm cách kích hoạt bất kỳ hành động nào khi mô hình bị thay đổi ... trông giống như thế này. Cảm ơn. –

0

Sử dụng treo một chức năng với các mô hình của bạn post_save sử dụng tín hiệu django (http://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.post_save)

Trong đó tiêu chuẩn chức năng sử dụng gửi thư django: http://docs.djangoproject.com/en/dev/topics/email/

+3

Bạn sẽ không có giá trị cũ trong post_save, vì vậy sẽ không có bất kỳ cách nào để biết liệu giá trị có thực sự thay đổi hay không. –

2

Bạn có thể sử dụng django-model-changes để thực hiện việc này mà không cần tra cứu cơ sở dữ liệu bổ sung:

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

điều này làm việc thực sự tốt cho các yêu cầu của tôi .. – Amistad

+0

Tôi rất vui vì nó rất hữu ích! –

0

Something như thế này có thể giúp đỡ và chỉ gửi một email khi thay đổi từ false thành 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) 
Các vấn đề liên quan