2010-07-13 46 views
20

Trong dự án của tôi, tôi đã thêm nguồn cấp tin tức. Nhưng khi cố gắng gửi email với chức năng này:Gửi email HTML bằng django

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() 

sử dụng những mẫu:

//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> 

và các mô hình:

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"),) 

tôi nhận được:

TemplateSyntaxError at /utils/newsletter_send/
Caught an exception while rendering: 'dict' object has no attribute 'autoescape'

trong {{}} n.date trong text_email mẫu

Mặc dù debug của tôi cho thấy tôi gửi bản tin đúng đối tượng vào mẫu, cũng như gỡ lỗi ngữ cảnh:

context {'email': u'[email protected]', 'n': <Newsletter: Newsletter object>}

Tại sao điều đó xảy ra? Từ những gì tôi đã tìm thấy về lỗi này bằng cách nào đó kết nối để gửi từ điển trống đến trình kết xuất mẫu, nhưng không phải của tôi ...

+0

trong mô hình trường ngày định nghĩa của bạn được đặt tên là 'dữ liệu', đó là một lỗi đánh máy trong khi đăng câu hỏi hoặc bạn có nó như thế trong mã cũng ?? – Ashok

+0

typo, đó là ngày ở mọi nơi. Dunno làm thế nào điều này có thể đã xảy ra mặc dù ... :) – crivateos

+0

trong #django bản ghi tôi đã đọc 'Bạn đang đi qua một từ điển để một cái gì đó đã được mong đợi một đối tượng bối cảnh.' . Làm thế nào để giải quyết điều này? – crivateos

Trả lời

10

Đây là một sửa chữa khá đơn giản, bạn đang thiếu một điều nhỏ.

Bạn đang làm điều này:

d = { 'n': n,'email': to } 

Tiếp theo là cố gắng sử dụng từ điển mà như là một phần của phương pháp render() của bạn. Tuy nhiên, render mất một Context vì vậy bạn cần phải làm điều này:

d = Context({ 'n': n,'email': to }) 

Hãy chắc chắn để nhập nó từ django.template là tốt. Điều đó sẽ khắc phục lỗi bạn đang nhận.

17

Chỉ vì mục đích thông tin. Tôi đã tìm thấy một cách khác để làm điều này:

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('/') 
+0

Đúng. Đây là một cách tốt để làm điều đó. – bozdoz

+2

Bạn đã thoát khỏi câu lệnh nhập 'từ phương thức django.core.mail EmailMultiAlternatives' –

+1

Điều này có nghĩa vụ gửi email HTML hay không? Tôi đang thử phương pháp này nhưng tôi chỉ nhận được tin nhắn văn bản –

11

Họ đã cập nhật send_mail cho phép các thư html trong dev version

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('/') 
+2

cho Django> = 1.7 – laffuste

Các vấn đề liên quan