2010-07-13 6 views
20

Nel mio progetto ho aggiunto un feed della newsletter. Ma quando si cerca di inviare e-mail con questa funzione:Invio di email HTML in 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() 

utilizzando quei modelli:

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

e modelli:

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

sto ottenendo:

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

in {{}} n.date entro text_email modello

Anche se il mio messaggi mostra sto inviando newsletter corretta oggetti al modello, così come contesto di debug:

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

Perché sta succedendo? Da quello che ho trovato su questo errore è in qualche modo collegato all'invio di un dizionario vuoto al renderer di template, ma il mio non è vuoto ...

+0

nel vostro modello di campo data di definizione è chiamato come 'dati', è che un refuso mentre postando la domanda o ce l'hai in codice ?? – Ashok

+0

typo, è data ovunque. Non so come sia potuto accadere però ... :) – crivateos

+0

nei log #django Ho letto "Stai trasmettendo un dizionario a qualcosa che si aspettava un oggetto Context". . Come risolvere questo? – crivateos

risposta

10

Questa è una soluzione piuttosto semplice, ti manca una cosa minore.

si sta facendo questo:

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

Seguito da cercando di usare quel dizionario come parte del vostro metodo render(). Tuttavia, render prende un Context quindi è necessario fare questo:

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

Assicurarsi di importarlo da django.template pure. Questo dovrebbe risolvere l'errore che stai ricevendo.

17

Solo per scopi informativi. Ho trovato un altro modo di fare questo:

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

Sì. Questo è un buon modo per farlo. – bozdoz

+2

Hai omesso l'istruzione import di 'from django.core.mail import EmailMultiAlternatives' –

+1

Si suppone che invii email HTML o come funziona? Sto provando questo approccio ma ricevo solo il messaggio di testo –

11

Hanno aggiornato send_mail per consentire i messaggi HTML nel 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

per Django> = 1.7 – laffuste