Замена текста переменными - PullRequest
0 голосов
/ 16 ноября 2011

Я должен отправить письма определенным клиентам, и у меня есть стандартное письмо, которое мне нужно использовать. Я хочу заменить часть текста внутри тела сообщения переменными.

Вот мой 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 %}

Очень ценится.

Ответы [ 4 ]

4 голосов
/ 16 ноября 2011

использовать формат строки :

>>> print "today is %(date)s, im %(age)d years old!" % {"date":"my birthday!","age":100}
today is my birthday!, im 100 years old!
2 голосов
/ 17 ноября 2011

Я думаю, что это лучший способ сделать это.Во-первых, у вас есть файл с вашим шаблоном, что-то вроде:

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

Итак, ваше представление будет выглядеть примерно так::

Dear Mr. Johnson,
AN IMPORTANT REMINDER…
You have a banana that is maturing on 11-17-2011 with something else.
etc ...
0 голосов
/ 16 ноября 2011

Вы можете использовать подстановку регулярного выражения с обратным вызовом. Преимущество этого по сравнению с простой заменой строк или использованием механизма шаблонов 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 голосов
/ 16 ноября 2011

Одним из решений является использование движка шаблонов Django на самом теле (как вы делаете при рендеринге страницы).Я уверен, что это может повлиять на безопасность, если текст редактируется пользователями и т. Д.

Более простое решение - простая замена строки.Например, учитывая то, что у вас есть выше:

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

Это не самое красивое решение, но если шаблон вашего тела исправлен, вам нужно сделать что-то подобное.

...