Переопределение методов save() или пишем сигнал post_save() — Django

Довольно часто возникает задача: при сохранении модели произвести те или иные действия с данными.
Вот типичная задача: при добавлении новости произвести рассылку подписавшимся на новости.

# Модель подписавшихся на рассылку
class Subscrib(models.Model):
    Список объектов

# Модель новостей
class News(models.Model):
    Список объектов

def go_subscrib(sender, instance, created, **kwargs):
    if created and instance.status == 1:
        title = instance.title.encode('utf-8') # у меня на одном из проектов ругался на кодировку
        for item in Subscrib.objects.all():
            to_email = item.email
            subject = 'Новая новость на сайте'
            html_content = '<p><i>Здравствуйте</i></p>'
            html_content += 'Новая новость: <a href="http://developtolive.com/news/%s/">%s</a>' % (instance.id, title)
            html_content +='<p><i>Отписаться от рассылки можно по <a href="http://developtolive.com/send/sub/no/?email=%s">ссылке</a></i></p>' % (item.id)
            html_content += '<p><i>Всего доброго.</i></p>'
            from_email = 'i@developtolive.com'
            msg = EmailMessage(subject, html_content, from_email, [to_email])
            msg.content_subtype = "html"
            msg.send()
signals.post_save.connect(go_subscrib, sender=News)

Или же вот такая задача: произвести рассылку при сохранении новости. Тогда мы переопределяем метод save() в модели News

# Модель новостей
class News(models.Model):
    Список объектов
    def save(self):
        for item in Subscrib.objects.all():
            to_email = item.email
            subject = 'Обновление новостей на сайте'
            html_content = '<a href="http://developtolive.com/news/%s/">%s</a>' % (self.id, self.title)
            from_email = 'i@developtolive.com'
            msg = EmailMessage(subject, html_content, from_email, [to_email])
            msg.content_subtype = "html"
            msg.send()
        super(News, self).save()

Добавить комментарий