Почтовая шаблонная обработка в django

Как все мы знаем (или если), можно использовать шаблонную систему Django для рендеринга почтовых тел:

def email(email, subject, template, context):
    from django.core.mail import send_mail
    from django.template import loader, Context

    send_mail(subject, loader.get_template(template).render(Context(context)), 'from@domain.com', [email,])

Это имеет один дефект в моем уме: для редактирования предмета и содержания электронного письма необходимо отредактировать и представление и шаблон. В то время как я могу выровнять по ширине предоставляющий администраторский пользовательский доступ к шаблонам, я не предоставляю им доступ к необработанному Python!

То, что было бы действительно прохладно, - то, если Вы могли бы указать блоки в электронном письме и вытащить их отдельно при отправке электронного письма:

{% block subject %}This is my subject{% endblock %}
{% block plaintext %}My body{% endblock%}
{% block html %}My HTML body{% endblock%}

Но как Вы сделали бы это? Как Вы пошли бы о рендеринге всего одного блока за один раз?

7
задан Valentin Rocher 12 January 2010 в 19:16
поделиться

2 ответа

Это моя третья рабочая итерация. Предполагая, что у вас есть шаблон электронной почты, как так:

{% block subject %}{% endblock %}
{% block plain %}{% endblock %}
{% block html %}{% endblock %}

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

Я также мог пойти сверху с Python-Love.

def email_list(to_list, template_path, context_dict):
    from django.core.mail import send_mail
    from django.template import loader, Context

    nodes = dict((n.name, n) for n in loader.get_template(template_path).nodelist if n.__class__.__name__ == 'BlockNode')
    con = Context(context_dict)
    r = lambda n: nodes[n].render(con)

    for address in to_list:
        send_mail(r('subject'), r('plain'), 'from@domain.com', [address,])

def email(to, template_path, context_dict):
    return email_list([to,], template_path, context_dict)

def email_user(user, template_path, context_dict):
    return email_list([user.email,], template_path, context_dict)

def email_users(user_list, template_path, context_dict):
    return email_list([user.email for user in user_list], template_path, context_dict)

Как никогда, если вы можете улучшить это, пожалуйста, сделайте.

11
ответ дан 6 December 2019 в 23:06
поделиться

Просто использование два шаблона: один для корпуса и один для предмета.

0
ответ дан 6 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: