Если добавить новый блог в базу данных, то всем подписчикам отправляется письмо с уведомлением о текущем блоге в Django
Примечание: Добавьте новый блог только в админ-панель. model.py
class blog(models.Model):
author = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
blog_id = models.AutoField(primary_key=True)
blog_title=models.CharField(max_length=200)
created_at = models.DateTimeField(auto_now_add=True)
slug = models.CharField(max_length=500, blank=True)
tags = TaggableManager()
blog_category_name=models.ForeignKey(blog_category,on_delete=models.CASCADE,null=True,blank=True)
blog_sub_category_name=models.ForeignKey(blog_sub_category,on_delete=models.CASCADE,null=True,blank=True)
written_by = models.CharField(max_length=200, default='Prymus Brandcom')
image_banner= models.ImageField(upload_to='image_banner')
medium_thumbnail = models.ImageField(upload_to='medium_thumbnail')
content = RichTextField() # RichTextField is used for paragraphs
is_authentic=models.BooleanField(default=False)
class Meta: # Plurizing the class name explicitly
verbose_name_plural = 'blog'
def __str__(self): # Dundar Method
return self.blog_title
def save(self, *args, **kwargs): # Saving Modefied Changes
if not self.slug:
self.slug = slugify(self.blog_title)
#super(blog, self).save(*args, **kwargs)
super(blog, self).save(*args, **kwargs)
def snippet(self):
return self.content[:300]
и это моя таблица подписчиков:
class subscriber(models.Model):
name=models.CharField(max_length=150,default="")
email=models.EmailField(max_length=100)
def __str__(self): # Dundar Method
return self.name
Добавить новый блог в таблицу blog, а затем отправить почту всем зарегистрированным пользователям в таблице subscriber ???
Для этого можно использовать Django Signals.
(Предполагается, что вы сформировали свой класс моделей на PascalCase)
В вашем models.py
:
from django.dispatch import receiver
from django.core.mail import send_mass_mail
@receiver(signal=signal=models.signals.pre_save, sender=Blog)
def email_on_blogpost_saved(sender, instance, **kwargs):
# You'll must check if this `blog`` have been ever sent to suscribers
# because this function will be executed on each save that include modification.
recipient_mails = Subscriber.objects.values_list('email', flat=True)
new_mail = ('New post from XXX ', 'FooMessage', 'name@example.com', recipient_mails)
send_mass_mail((new_mail, ), fail_silently=False)
Добавьте булево поле в have_been_sent
для предотвращения повторной отправки писем:
@receiver(signal=signal=models.signals.pre_save, sender=Blog)
def email_on_new_blogpost(sender, instance, **kwargs):
current_blog = sender.objects.get(pk=instance.pk)
if current_blog.have_been_sent:
pass
else:
recipient_mails = Subscriber.objects.values_list('email', flat=True)
new_mail = ('New post from XXX ', 'FooMessage', 'name@example.com', recipient_mails)
send_mass_mail((new_mail, ), fail_silently=False)
Не забудьте настроить Django для майлинга, настроив settings.py
как показано в doc