2016-04-13 14 views
0

I html als Nachricht in einer E-Mail verwenden und einige Variablen wie folgt passieren:Verwenden Variablen in send_email()

subject = 'Some Subject' 
plain = render_to_string('templates/email/message.txt',{'name':variableWithSomeValue,'email':otherVariable}) 
html = render_to_string('templates/email/message.html',{'name':variableWithSomeValue,'email':otherVariable}) 
from_email = setting.EMAIL_HOST_USER 
send_email(subject, plain, from_email, [variableToEmail], fail_silently=False, html_message=html) 

Das gut funktioniert, aber jetzt muss ich aus der Datenbank den Nachrichteninhalt von einem Tisch nehmen, die Tabelle hat drei Spalten, im ersten Register haben Sie diese Werte in jeder Spalte. Spalte subject haben Account Info, Spalte plain haben Hello {{name}}. Now you can access to the site using this email address {{email}}. und die Spalte html haben <p>Hello <strong>{{name}}</strong>.</p> <p>Now you can access to the site using this email address <strong>email</strong>.</p>.

So die Werte aus der Datenbank zu übernehmen muss ich diese obj = ModelTable.objects.get(id=1) dann das:

subject = obj.subject 
plain = (obj.plain,{'name':variableWithSomeValue,'email':otherVariable}) 
html = (obj.html,{'name':variableWithSomeValue,'email':otherVariable}) 
from_email = setting.EMAIL_HOST_USER 
send_email(subject, plain, from_email, [variableToEmail], fail_silently=False, html_message=html) 

Aber das gibt mir den Fehler

AttributeError: 'tuple' object has no attribute 'encode'

so ich versuchte .encode(´utf-8´) für die Werte vorbei und gibt mir der gleiche Fehler, dann ändere den Wert für jede Variable und finde, dass das Problem von plain = (obj.plain,{'name':variableWithSomeValue,'email':otherVariable}) und html = (obj.html,{'name':variableWithSomeValue,'email':otherVariable}) kommt, also denke ich, dass ich die Variablen falsch übergebe, also Wie ca n mache ich es richtig? oder vielleicht ist für die Codierung der Datenbank, aber ich denke, dass mit .encode(utf-8) sollte das Problem lösen, aber ich glaube wirklich, dass ich die Variablen name und email in die falsche Richtung übergeben.

Sorry für die lange Post und meine schlechte Grammatik, wenn mehr Informationen benötigen, lass es mich wissen.

Antwort

1

Ich nehme an, dass obj.plain und obj.html Zeichenfolgen sind, die Ihre Vorlagen darstellen (wie in der Datenbank gespeichert)?

Wenn dies der Fall ist, müssen Sie immer noch Ihre E-Mail-Inhalte rendern. Anstatt zu verwenden, die als ersten Argument einen Vorlagenpfad verwendet, möchten Sie jedoch eine Vorlage erstellen, die auf Ihrer Zeichenfolge basiert, und dann diese Vorlage rendern. Betrachten wir etwa wie folgt:

... 
from django.template import Context, Template 
plain_template = Template(obj.plain) 
context = Context({'name':variableWithSomeValue,'email':otherVariable}) 
email_context = plain_template.render(context) 
... 
send_email(...) 

Hier ist ein Link ist, dass eine bessere String-Vorlagen erklärt Rendering, wie zum Rendern Template-Dateien entgegen.

https://docs.djangoproject.com/en/1.7/ref/templates/api/#rendering-a-context

+0

Vielen Dank, das funktioniert perfekt –

Verwandte Themen