通过sendgrid python API库将django对象上下文传递给sendgrid电子邮件

通过sendgrid python API库将django对象上下文传递给sendgrid电子邮件,python,django,python-3.x,sendgrid,sendgrid-api-v3,Python,Django,Python 3.x,Sendgrid,Sendgrid Api V3,我的django应用程序有一个视图,账户可以使用Sendgrid的API向联系人和订户发送时事通讯电子邮件。发送时使用的是纯文本电子邮件: from sendgrid import SendGridAPIClient from sendgrid.helpers.mail import (Mail, Subject, To, ReplyTo, SendAt, Content, From, CustomArg, Header) def compose_email(request, send_to

我的django应用程序有一个视图,账户可以使用Sendgrid的API向联系人和订户发送时事通讯电子邮件。发送时使用的是纯文本电子邮件:

from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import (Mail, Subject, To, ReplyTo, SendAt, Content, From, CustomArg, Header)


def compose_email(request, send_to, *args, **kwargs):
    ...
    if request.method == 'POST':
            subject = request.POST.get('subject')
            from_name = request.POST.get('from_name')
            body = request.POST.get('body')
            reply_to = request.POST.get('reply_to')
            test_address = [request.POST.get('test_address')]
            # send test email
            if request.POST.get('do_test'):
                if form.is_valid():
                    message = AccountEmailMessage(account=account, subject=subject,
                                                from_name=from_name, destination=destination, body=body, reply_to=reply_to,
                                                is_draft=True, is_sent=False)
                    message.save()
                    email = Mail(
                        subject=subject,
                        from_email=hi@app.foo,
                        html_content=body,
                        to_emails=test_address,
                    )
                    email.reply_to = ReplyTo(reply_to)

                    try:
                        sendgrid_client = SendGridAPIClient(settings.SENDGRID_API_KEY)
                        response = sendgrid_client.send(email)
                        message.sendgrid_id = response.headers['X-Message-Id']
                        message.save()
                    except Exception as e:
                        log.error(e)
                    messages.success(request, 'Test message has been successfully sent')
                else:
                    messages.error(request, 'Please, check for errors')
这很有效。但是我们想从Account(Account)在html电子邮件模板中呈现django对象属性(通过模板标记的模型字段)[假设它只是一个普通的obj req查询
Account=Account.objects.get(id=selected_Account)
,我不清楚推荐的文档方法是什么

尝试:

    if request.method == 'POST':
        subject = request.POST.get('subject')
        from_name = request.POST.get('from_name')
        body = request.POST.get('body')
        reply_to = request.POST.get('reply_to')
        if request.POST.get('send'):
                if form.is_valid():
                    message = AccountEmailMessage(account=account, subject=subject,
                                                from_name=from_name, destination=destination, body=body, reply_to=reply_to,
                                                is_draft=False, is_sent=True)
                    message.save()

                    rendered = render_to_string('email/newsletter.html', {
                      'account': account,
                      'protocol': settings.DEFAULT_PROTOCOL,
                      'domain': settings.DOMAIN,
                      'message_body': body
                    })

                    email = Mail(
                        subject=subject,
                        from_email=hi@app.foo,
                        html_content=rendered,
                        to_emails=recipients,
                        mime_type='text/html'
                    )
                    email.reply_to = ReplyTo(reply_to)

                    try:
                        sendgrid_client = SendGridAPIClient(settings.SENDGRID_API_KEY)
                        response = sendgrid_client.send(email)
                        message.sendgrid_id = response.headers['X-Message-Id']
                        message.save()
                    except Exception as e:
                        log.error(e)
但在提交时,这会抛出一个错误:
NoReverseMatch:Reverse for'account'not found当我尝试将account作为kwarg传递给上下文并将其呈现为字符串时,“account”不是有效的视图函数或模式名称


查看文档()我看到Mail()有一个
.dynamic\u template\u data
属性。处理来自同一obj的大量字段以及图像URL等属性的效率非常低,而且还需要使用遗留事务模板()。我看到Sendgrid有一个个性化obj()-这是实现这一点的推荐方法吗?

多亏了Iain在进一步测试中意识到我们有两个问题:

  • 试图通过{%url%}标记对模板中的url进行编码,该标记抛出了
    NoReverseMatch

  • mime\u type='text/html'
    不是有效的邮件kwarg(),也删除了它


  • 在(1)和(2)一切正常后,无需进行个性化设置

    多亏了Iain在进一步测试中意识到我们有两个问题:

  • 试图通过{%url%}标记对模板中的url进行编码,该标记抛出了
    NoReverseMatch

  • mime\u type='text/html'
    不是有效的邮件kwarg(),也删除了它


  • 在(1)和(2)一切正常后,不需要进行个性化设置

    电子邮件/newsletter.html中的内容
    ?你有任何
    {%url%}
    标签吗?谢谢你,监督-是的,里面有一个url标签
    电子邮件/newsletter.html
    ?你有任何
    {%url%}
    标签吗?谢谢你,疏忽-是的,里面有一个url标签