最简单的策略是将订阅模块添加到Mezzanine博客

时间:2018-01-25 16:09:37

标签: django mezzanine

我有一个Mezzanine博客,我想在每个页面添加一个小表格,以便用户可以输入他们的电子邮件地址并点击“订阅”,这样,从那一刻起,将发送一封电子邮件,宣布任何新帖子到博客。

我没有看到为此目的内置或任何现有模块......我应该从头开始编程吗?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

由于没有答案,我将尽力提供最佳策略,以了解这种情况下最简单的策略。我不知道Mezzanine中有任何执行这个特定功能的内置函数,所以这就是我如何处理它:

  1. python manage.py startapp subscriber
  2. 构建基本模型 - email = models.EmailField(unique=True)
  3. 创建基本admin.py
  4. 更新settings.py - > INSTALLED_APPSADMIN_MENU_ORDER

    ADMIN_MENU_ORDER = (
        (_("Web Content"), ((_("Pages"), "pages.Page"),
            (_("Subscribers"), "subscriber.Subscriber"),
    
  5. 创建forms.py - 类似这样的内容:

    class SubscriberForm(forms.ModelForm):
        class Meta:
            model = Subscriber
            fields = ['email']
    
  6. 为上述表单的GET / POST设置views.py

  7. 重新配置urls.py以重定向到新视图功能
  8. 然后,也许是我的回复中唯一有趣的部分,我会将Mezzanine Blog应用目录复制到项目目录中,然后创建signals.py。也许添加这样的东西:

    @receiver(pre_save, sender=BlogPost, dispatch_uid="save_blogpost")
    def save_blogpost(sender, instance, **kwargs):
        """ Every time a new blog post is created, notify all subscribers."""
        if instance.published:
            subs = Subscriber.objects.all()
            for sub in subs:
                email = EmailMultiAlternatives(
                    subject="New Blog Post!",
                    body="A new blog post has been added!",
                    from_email="example@email.com",
                    to=[sub.email]
                )
                email.attach_alternative(self.body, "text/html")
                email.send()
    
  9. 在博客应用目录中更新app.py以在Config类下包含此内容:

    def ready(self):
        import blog.signals  # noqa
    
  10. 如果您已将Django配置为通过外部SMTP邮件服务器发送邮件,则更容易。如果没有,您可能希望setup Postfix使用OpenDKIM并配置SPF以减少外发邮件最终成为垃圾邮件的可能性。

    (另外,您显然需要处理管理员将草稿更改为已发布帖子的情况等)。

    不确定这是否有帮助,但希望如此!