2015-08-14 48 views
1

我正在使用Django-Markdown-deux爲電子郵件模板呈現HTML。如何在電子郵件中爲Markdown設置默認樣式

考慮以下輸入:

# Heading 1 
Text goes here 

這將呈現爲:

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

有沒有辦法添加默認樣式的每個元素?注意款式需要內聯,因爲這是電子郵件。例如:

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

Markdown是否被複制到電子郵件客戶端之前由電子郵件客戶端或其他工具呈現?無論哪種情況,都可能有助於瞭解您使用哪種工具將Markdown降格爲HTML。 – Waylan

+0

此外,爲什麼這個標籤爲「django」?我沒有看到連接。 – Waylan

+1

如果「django」標籤意味着您正在尋找從Django內部使用的解決方案,那麼您可能希望將其標記爲「Python」。如果是這樣,那麼這是[這個問題](http://stackoverflow.com/q/3960721/866026)的重複,它指向幾個不同的Python庫可能解決這個問題。 – Waylan

回答

2

這不是Markdown本身可以完成的事情。但是,有一些Python庫會採用HTML輸入(以及一些CSS)並輸出帶有內聯樣式的重新格式化的HTML(如theseanswers所指出的那樣)。因此,您需要將Markdown的輸出傳遞到其中一個庫中。

由於您正在使用Django模板過濾器(我假設過濾器而非Deux提供的Tag)將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


如果在模板中定義(在<style>標籤)樣式,然後將這些款式大概需要應用到整個文檔(而不僅僅是通過降價產生的一部分)。請注意,內聯工具將接受一個完整的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) ... 

沒有更多的信息關於你的具體情況,上面的代碼中留下了很多了。只解決這個特定問題的相關位。有更多的工作觀點。儘管如果你已經有了工作視圖,那麼你可能只需要用上面幾行代替渲染模板的那一行。

+0

謝謝,很好的解決方案。如果我想將模板中的'