2011-11-16 66 views
0

我必须向某些客户发送信件,并且我有一个我需要使用的标准信件。我想用变量替换邮件正文中的一些文本。用变量代替文本

这里是我的maturity_letter models.py

class MaturityLetter(models.Model): 
default = models.BooleanField(default=False, blank=True) 
body = models.TextField(blank=True) 
footer = models.TextField(blank=True) 

现在身体有这样一个值:

亲爱的[初级名字],

一个重要的提醒...

您有[成熟期]与[金融机构]成熟的[产品]。

现在我想用我的模板变量替换括号中的一切。

这是我在我的views.py至今:

context = {} 
if request.POST: 
    start_form = MaturityLetterSetupForm(request.POST) 
    if start_form.is_valid(): 
     agent = request.session['agent'] 
     start_date = start_form.cleaned_data['start_date'] 
     end_date = start_form.cleaned_data['end_date'] 
     investments = Investment.objects.all().filter(maturity_date__range=(start_date, end_date), plan__profile__agent=agent).order_by('maturity_date') 
     inv_form = MaturityLetterInvestments(investments, request.POST) 
     if inv_form.is_valid(): 
      sel_inv = inv_form.cleaned_data['investments'] 
      context['sel_inv'] = sel_inv 
     maturity_letter = MaturityLetter.objects.get(id=1) 

     context['mat_letter'] = maturity_letter 
     context['inv_form'] = inv_form 
     context['agent'] = agent 
     context['show_report'] = True 

现在,如果通过sel_inv我可以访问sel_inv.maturity_date等,但我在如何替换文本失去我循环。

在我的模板,所有我至今是:

{% if show_letter %} 
{{ mat_letter.body }} <br/> 
{{ mat_letter.footer }} 
{% endif %} 

大加赞赏。

回答

2

我觉得这是做到这一点的最佳方式。首先,你必须与你的模板文件,是这样的:

Dear {{primary-firstname}}, 
AN IMPORTANT REMINDER… 
You have a {{product}} that is maturing on {{maturity_date}} with {{financial institution}}. 
etc ... 

那么,您认为会是这样的:

from django.template.loader import render_to_string 

# previous code ... 
template_file = 'where/is/my/template.txt' 
context_data = {'primary-firstname': 'Mr. Johnson', 
       'product': 'banana', 
       'maturity_date': '11-17-2011', 
       'financial institution': 'something else'} 
message = render_to_string(template_file, context_data) 
# here you send the message to the user ... 

所以,如果你print message你会得到:

Dear Mr. Johnson, 
AN IMPORTANT REMINDER… 
You have a banana that is maturing on 11-17-2011 with something else. 
etc ... 
4

使用format strings

>>> print "today is %(date)s, im %(age)d years old!" % {"date":"my birthday!","age":100} 
today is my birthday!, im 100 years old! 
+0

Nifty我没有意识到你可以“%(var)s”来调用字典元素并将它们放在字符串位置。给予好评! – mayotic

0

一种解决方案是使用Django的模板引擎对身体本身(如你做渲染页面时)。如果文本可由用户编辑,我相信会有安全隐患。

更简单的解决方案是简单的字符串替换。例如,假设你有什么上面:

for var, value in sel_inv.items: 
    body = body.replace('[%s]' % var, value) 

这不是最漂亮的解决方案,但如果你的身体模板固定的,你需要做这样的事情。

+1

如果你要走这条路线,最好使用[此版本](http://docs.python.org/library/stdtypes.html#str.format)对新代码进行字符串格式化操作,因为它的未来证明(注意:Python 2.6+)。 –

-1

您可以使用正则表达式替换回调。这在一个简单的字符串替换或使用Django的模板引擎的好处是,你也知道,当使用不确定的变量(因为你可能不希望发出信件/邮件一样,:)

import re 

body = """ 
Dear [primary-firstname], 

AN IMPORTANT REMINDER... 

You have a [product] that is maturing on [maturity_date] 
with [financial institution]. 

etc 
""" 

def replace_cb(m): 
    replacements = {'primary-firstname': 'Gary', 
        'product': 'Awesome-o-tron2k', 
        'maturity_date': '1-1-2012', 
        'financial institution': 'The bank'} 
    r = replacements.get(m.groups()[0]) 
    if not r: 
     raise Exception('Unknown variable') 
    return r 

new_body = re.sub('\[([a-zA-Z-_ ]+)\]', replace_cb, body) 
+0

我认为这实际上是非常复杂的。 – juliomalegria