2014-04-01 21 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/ –

相关问题