2016-04-13 1 views
0

J'utilise html comme message dans un e-mail et passe certaines variables comme celui-ci:Utiliser les variables dans 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) 

qui fonctionne bien, mais maintenant je dois prendre le contenu du message d'une table de la base de données, la table a trois colonnes, dans le premier registre ont ces valeurs dans chaque colonne. Colonne subject ont Account Info, colonne plain ont Hello {{name}}. Now you can access to the site using this email address {{email}}. et la colonne html ont <p>Hello <strong>{{name}}</strong>.</p> <p>Now you can access to the site using this email address <strong>email</strong>.</p>.

Donc, pour prendre les valeurs de la base de données que je fais obj = ModelTable.objects.get(id=1) alors ceci:

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) 

Mais cela me donne l'erreur

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

donc j'ai essayé de passer .encode(´utf-8´) pour les valeurs et donne moi la même erreur, puis changer la valeur pour chaque variable et de trouver que le problème vient de plain = (obj.plain,{'name':variableWithSomeValue,'email':otherVariable}) et html = (obj.html,{'name':variableWithSomeValue,'email':otherVariable}) donc je pense que je passe les variables dans le mauvais sens, donc Comment ca n Je le fais de la bonne façon? ou peut-être est pour l'encodage de la base de données, mais je pense que l'utilisation .encode(utf-8) devrait résoudre ce problème, mais je pense vraiment que je passe les variables name et email dans le mauvais sens.

Désolé pour le poste long et ma mauvaise grammaire, si besoin plus d'informations s'il vous plaît faites le moi savoir.

Répondre

1

Je suppose que obj.plain et obj.html sont des chaînes représentant vos modèles (tels que stockés dans la base de données)?

Si c'est le cas, vous devez toujours afficher le contenu de votre courrier électronique. Cependant, au lieu d'utiliser render_to_string, qui prend comme premier argument un chemin de modèle, vous devrez créer un modèle basé sur votre chaîne, puis rendre ce modèle. Pensez à quelque chose comme ce qui suit:

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

est ici un lien qui explique mieux le rendu des modèles de chaîne, par opposition à rendre les fichiers de modèle.

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

+0

Merci beaucoup, cela fonctionne parfaitement –