Desidero inviare un messaggio di posta elettronica quando un campo specifico viene modificato in un modello. È possibile? Ecco cosa sto cercando. Ho un modello di profilo che include un campo booleano che, quando l'amministratore seleziona true, desidero inviare un messaggio all'utente. So che potrei metterlo in un "def save (self):" ma, quello spara via un'e-mail ogni volta che il modello viene cambiato e il campo è vero. C'è un modo per avere solo e-mail se il campo è stato modificato da False a True?Django - invia e-mail sul cambio di modello
risposta
Salva metodo è perfettamente buon posto per quello che si vuole fare:
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()
con il gancio di una funzione con i tuoi modelli post_save utilizzando segnali Django (http://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.post_save)
In tale standard uso funzione mailing django: http://docs.djangoproject.com/en/dev/topics/email/
Non si avrà il vecchio valore in post_save, quindi non ci sarebbe alcun modo di sapere se il valore è effettivamente cambiato o meno. –
È possibile utilizzare django-model-changes per eseguire questa operazione senza una ricerca di database aggiuntiva:
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
questo ha funzionato davvero bene per le mie esigenze .. – Amistad
Sono contento che sia stato utile! –
Qualcosa di simile potrebbe aiutare e invia una e-mail solo quando il cambiamento da false a 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)
mi potrebbe cambiare l'istruzione if a questo: se non old.field == self.field: – ShawnMilo
Vuole inviare email solo quando il valore è cambiato da False a True. Quindi controllare che i valori non siano uguali non è abbastanza. –
Cercavo un modo per attivare un'azione quando un modello è cambiato ... sembra che sia così. Grazie. –