2014-04-01 49 views
0

因此,我要讓用戶爲預訂應用程序的電子郵件確認鍵入文檔草稿。該草案可能會是這個樣子:在django中合併用戶創建的電子郵件模板中的字段

Dear [contactname], This is your booking confirmation for your vacation from [startdate] to [enddate] for a total of [numdays] days. Please click [cancellink] to cancel your booking.

電子郵件纔有意義,相對於預約的對象。目前,我有需要預訂對象和合並字符串,並決定做什麼樣的方法:

def merge_field(booking, ms): 
    if ms == 'contactname': 
     return booking.contactsheet.name 
    elif ms == 'startdate': 
     return str(booking.firstday) 
    elif ms == 'enddate': 
     return str(booking.lastday) 
    elif ms == 'numdays': 
     return str((booking.firstday - booking.lastday).days + 1) 
    elif ms == 'cancellink': 
     return '<a href="http://server.com/cancelbooking/' + str(booking.hashvalue) + '">cancel</a>' 

這種硬編碼的做法是很醜陋。我寧願讓用戶提供一個我可以解析的字符串,並推斷一些像預訂對象的引用,一些算術和靜態字符串(如鏈接中)的含義。我想像這樣一個模型:

class MergeField(models.Model): 
    name = models.CharField(max_length=100) 
    formula = models.TextField() 

然後用戶可以設計和測試自己的合併域,並在電子郵件模板中使用它們。這將使維護更容易。但是,我不知道如何解析這個公式字段。

你有什麼想法如何做到這一點?

回答

1

更好的解決方案是使用django模板系統。讓用戶以django模板格式輸入消息,如: 親愛的{{contactname}}, 這是您的{{startdate}}至{{enddate}}假期的預訂確認,總計爲{{numdays}}天。 請點擊{{cancellink}}取消您的預訂。

然後使用get_template_from_stringdjango.template.loader並獲得一個模板實例。您可以通過執行template.render(context)來渲染模板,其中上下文是在django.template.context中找到的Context實例。 你可以在https://docs.djangoproject.com/en/1.6/ref/templates/api/閱讀更多關於django模板api應該從這裏簡單。

+0

我喜歡它。我不知道你可以這樣做。我確定這正是它應該完成的方式。當我有機會開展工作時,會使這個答案成爲可以接受的答案。 –

+0

好的。祝你好運。如果您需要更多建議,請給我留言。 –

+0

它看起來像他們建議模板()而不是get_template_from_string(),但它看起來基本相同。 https://docs.djangoproject.com/en/1.6/ref/templates/api/ –

相關問題