私のプロジェクトでは、ニュースレターフィードを追加しました。しかし、この機能でメールを送信しようとすると:
def send(request):
template_html = 'static/newsletter.html'
template_text = 'static/newsletter.txt'
newsletters = Newsletter.objects.filter(sent=False)
subject = _(u"Newsletter")
adr = NewsletterEmails.objects.all()
for a in adr:
for n in newsletters:
to = a.email
from_email = settings.DEFAULT_FROM_EMAIL
subject = _(u"Newsletter Fandrive")
text = get_template(template_text)
html = get_template(template_html)
d = { 'n': n,'email': to }
text_content = text.render(d)
html_content = html.render(d)
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()
それらのテンプレートの使用:
//text
=================== Newsletter - {{ n.date }} ============
==========================================================
{{ n.title }}
==========================================================
{{ n.text }}
==========================================================
//html
<html>
<head>
</head>
<body>
<div style="">
<div style="">
<h1 style="">{{ n.title }} - {{n.date}}</h1>
<p style="">
{{ n.text }}
</p>
</div>
</div>
</body>
</html>
およびモデル:
class Newsletter(models.Model):
title = models.CharField("title", blank=False, max_length=50)
text = models.TextField("text", blank=False)
sent = models.BooleanField("sent", default=False)
data = models.DateTimeField("creation date", auto_now_add=True, blank=False)
class NewsletterEmails(models.Model):
email = models.EmailField(_(u"e-mail address"),)
私は得ています:
TemplateSyntaxError at /utils/newsletter_send/
Caught an exception while rendering: 'dict' object has no attribute 'autoescape'
in {{n.date}} text_emailテンプレート内
私のデバッグは、適切なニュースレターオブジェクトをテンプレートに送信していることを示していますが、デバッグコンテキストも同様です。
context {'email': u'[email protected]', 'n': <Newsletter: Newsletter object>}
なぜそれが起こっているのですか?このエラーについて私が見つけたものから、それはどういうわけか空の辞書をテンプレートレンダラーに送信することに関連していますが、私のものは空ではありません...
これは非常に簡単な修正です。1つの小さな問題がありません。
あなたはこれをやっています:
d = { 'n': n,'email': to }
続いて、render()メソッドの一部としてその辞書を使用しようとします。ただし、render
はContext
を取るため、次のようにする必要があります。
d = Context({ 'n': n,'email': to })
必ずDjango.template
からもインポートしてください。これで、受け取ったエラーが修正されるはずです。
情報提供のみを目的としています。私はこれを行う別の方法を見つけました:
def send(request):
template_html = 'static/newsletter.html'
template_text = 'static/newsletter.txt'
newsletters = Newsletter.objects.filter(sent=False)
subject = _(u"Newsletter Fandrive")
adr = NewsletterEmails.objects.all()
for a in adr:
for n in newsletters:
to = a.email
from_email = settings.DEFAULT_FROM_EMAIL
subject = _(u"Newsletter Fandrive")
text_content = render_to_string(template_text, {"title": n.title,"text": n.text, 'date': n.date, 'email': to})
html_content = render_to_string(template_html, {"title": n.title,"text": n.text, 'date': n.date, 'email': to})
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()
return HttpResponseRedirect('/')
彼らはsend_mail
を更新して、 開発バージョン でhtmlメッセージを許可するようにしました。
def send(request):
template_html = 'static/newsletter.html'
template_text = 'static/newsletter.txt'
newsletters = Newsletter.objects.filter(sent=False)
subject = _(u"Newsletter Fandrive")
adr = NewsletterEmails.objects.all()
for a in adr:
for n in newsletters:
to = a.email
from_email = settings.DEFAULT_FROM_EMAIL
subject = _(u"Newsletter Fandrive")
text_content = render_to_string(template_text, {"title": n.title,"text": n.text, 'date': n.date, 'email': to})
html_content = render_to_string(template_html, {"title": n.title,"text": n.text, 'date': n.date, 'email': to})
send_mail(subject, text_content, from_email,
to, fail_silently=False, html_message=html_content)
return HttpResponseRedirect('/')