Django - отправить письмо на смену модели - PullRequest
6 голосов
/ 21 июля 2009

Я хочу отправить электронное письмо при изменении определенного поля в модели. Является ли это возможным? Вот что я ищу. У меня есть модель профиля, которая включает BooleanField, и когда администратор выбирает значение true, я хочу отправить пользователю электронное письмо. Я знаю, что мог бы поместить это в «def save (self):», но, который запускает электронное письмо каждый раз, когда меняется модель и поле имеет значение true. Есть ли способ получить его только по электронной почте, если поле было изменено с False на True?

Ответы [ 4 ]

11 голосов
/ 21 июля 2009

сохранить метод является идеальным местом для того, что вы хотите сделать:

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()
2 голосов
/ 13 октября 2013

Вы можете использовать django-model-changes , чтобы сделать это без дополнительного поиска в базе данных:

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 голосов
/ 30 декабря 2015

Как-то так может помочь и отправляет электронное письмо только при изменении с ложного на истинное

#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)
0 голосов
/ 21 июля 2009

Используйте функцию подключения к вашим моделям post_save, используя сигналы django (http://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.post_save)

В этой функции используется стандартная рассылка django: http://docs.djangoproject.com/en/dev/topics/email/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...