Если добавить новый блог в базу данных, то всем подписчикам отправляется письмо с уведомлением о текущем блоге в 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

Вернуться на верх