2010-07-13 5 views
20

Dans mon projet, j'ai ajouté un flux de newsletter. Mais en essayant d'envoyer des e-mails avec cette fonction:Envoyer un e-mail HTML dans 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() 

utilisant ces modèles:

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

et modèles:

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

Je reçois:

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

dans {{}} n.date au sein text_email modèle

Bien que mon débogage montre que je suis l'envoi d'objets bulletin propre au modèle, ainsi que le contexte de débogage:

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

Pourquoi ça arrive? D'après ce que j'ai trouvé sur cette erreur, il est en quelque sorte connecté à l'envoi de dictionnaire vide à un moteur de rendu, mais le mien n'est pas vide ...

+0

dans votre champ de date de définition du modèle est désigné comme « données », est que une faute de frappe en posant la question ou vous l'avez comme ça dans le code aussi ?? – Ashok

+0

typo, c'est la date partout. Je ne sais pas comment cela aurait pu arriver ... :) – crivateos

+0

dans les journaux #django J'ai lu 'Vous passez un dictionnaire à quelque chose qui attendait un objet Context.' . Comment résoudre ceci? – crivateos

Répondre

10

Ceci est une solution assez simple, il vous manque une chose mineure.

Vous faites ceci:

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

Suivi en essayant d'utiliser ce dictionnaire dans le cadre de votre méthode render(). Cependant, render prend un Context donc vous devez faire ceci:

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

Assurez-vous de l'importer de django.template ainsi. Cela devrait corriger l'erreur que vous recevez.

17

Juste à titre informatif. Je l'ai trouvé une autre façon de le faire:

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

Oui. C'est un bon moyen de le faire. – bozdoz

+2

Vous avez omis la déclaration d'importation de 'depuis l'importation de django.core.mail EmailMultiAlternatives' –

+1

Est-ce supposé envoyer des e-mails HTML ou comment cela fonctionne-t-il? J'essaye cette approche mais je reçois seulement le message texte –

11

Ils ont mis à jour send_mail pour permettre aux messages html dans le 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

pour Django> = 1.7 – laffuste