【问题标题】:How to set default styles for Markdown in email如何在电子邮件中为 Markdown 设置默认样式
【发布时间】:2015-11-08 01:18:23
【问题描述】:

我正在使用Django-Markdown-deux 为电子邮件模板呈现 HTML。

考虑以下输入:

# Heading 1
Text goes here

这将呈现为:

<h1>Heading 1</h1>
<p>Text goes here</p>

有没有办法为每个元素添加默认样式?注意 styles 需要内联,因为这是电子邮件。例如:

<h1 style="color:#eee;font-family:'Helvetica Neue'">Heading 1</h1>

【问题讨论】:

  • 在复制到电子邮件客户端之前,Markdown 是由电子邮件客户端呈现还是由其他工具呈现?无论哪种情况,了解您使用哪种工具将 Markdown 呈现为 HTML 可能会有所帮助。
  • 另外,为什么这被标记为“django”?我没有看到连接。
  • 如果“django”标签意味着您正在寻找在 Django 中使用的解决方案,那么您可能想将其标记为“Python”。如果是这样,那么这是 this question 的副本,它指向几个不同的 Python 库,可以解决这个问题。
  • @Waylan 谢谢,我使用 Django-Markdown-Deux 作为过滤器,因此使用了 Django 标签

标签: python django templates markdown


【解决方案1】:

这不是 Markdown 自己能做到的。但是,有一些 Python 库将接受 HTML 输入(和一些 CSS)并输出带有内联样式的重新格式化的 HTML(如 these answers 指出的那样)。因此,您需要获取 Markdown 的输出并将其传递到其中一个库中。

当您使用 Django 模板过滤器(我假设过滤器而不是 Deux 提供的标记)将 Markdown 呈现为 HTML 时,您需要创建第二个过滤器来包装其中一个 CSS 内联库和将 Markdown 过滤器的输出传递给您的自定义过滤器。您的自定义过滤器可能看起来像这样(未经测试):

from django import template
from django.utils.safestring import mark_safe
from pynliner import Pynliner

register = template.Library()

@register.filter(name="html2email")
def pynliner_filter(value):
    css = "h1 {color:#eee; font-family:'Helvetica Neue'}"
    p = Pynliner()
    return mark_safe(p.from_string(value).with_cssString(css).run())

然后,在你的模板中,你会这样做:

{{ myvar|markdown|html2email }}

有趣的是,我在过滤器中对 CSS 进行了硬编码。将其扩展为可定制的留给读者作为练习。有关创建和加载自定义模板过滤器的更多具体信息,请参阅Django's docs


如果您在模板中定义了样式(在&lt;style&gt; 标签中),那么这些样式可能需要应用于整个文档(而不仅仅是 Markdown 生成的部分)。请注意,内联工具将接受一个完整的 HTML 文件(其中定义了 CSS)并输出一个内联了这些样式的文件。如果这是您的情况,那么您将不需要使用自定义模板过滤器。相反,在呈现模板之后,您需要通过 Django 视图中的内联工具传递 HTML 文档。也许是这样的:

def someview(...)
    # Do your pre-template stuff here ...
    html = template.render()
    p = Pyliner()
    email_body = p.from_string(html).run()
    # Send your email here (or whatever you are doing) ...

如果没有关于您的具体情况的更多信息,上面的代码会遗漏很多内容。仅解决与此特定问题相关的位。有更多的工作视图。虽然,如果您已经有一个工作视图,那么大概您只需要用上面显示的几行替换呈现模板的行。

【讨论】:

  • 谢谢,很好的解决方案。如果我想将模板中的&lt;style&gt; 应用到过滤器而不是硬编码的 CSS,我应该从哪里开始?
  • @alias51 我在我的答案中添加了一个关于如何应用模板内&lt;style&gt; 标记中定义的样式的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 2013-10-02
  • 2011-05-22
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多