我在一封电子邮件中使用html
作为消息,并传递一些这样的变量:
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)
这样做很好但是现在我需要从数据库中的一个表中获取消息内容,该表有三列,在第一个寄存器中每列都有这个值。列subject
包含Account Info
,列plain
包含Hello {{name}}. Now you can access to the site using this email address {{email}}.
,列html
包含<p>Hello <strong>{{name}}</strong>.</p> <p>Now you can access to the site using this email address <strong>email</strong>.</p>
。
因此,为了从数据库中获取值,我执行此操作obj = ModelTable.objects.get(id=1)
,然后执行以下操作:
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)
但是这给了我错误
AttributeError:'tuple'对象没有属性'encode'
所以我尝试传递值.encode(´utf-8´)
并给出相同的错误,然后更改每个变量的值,发现问题来自plain = (obj.plain,{'name':variableWithSomeValue,'email':otherVariable})
和html = (obj.html,{'name':variableWithSomeValue,'email':otherVariable})
所以我认为我以错误的方式传递变量,所以我怎么能以正确的方式做到?或者可能是对数据库的编码,但我认为使用.encode(utf-8)
应该解决那个问题,但我真的认为我以错误的方式传递变量name
和email
。
很抱歉长篇文章和我的语法不好,如果需要更多信息,请告诉我。
答案 0 :(得分:1)
我假设obj.plain和obj.html是表示模板的字符串(存储在数据库中)?
如果是这种情况,那么您仍需要呈现电子邮件内容。但是,您需要根据字符串创建模板,然后再渲染该模板,而不是使用render_to_string
作为模板路径的第一个参数。考虑以下内容:
...
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(...)
这是一个更好地解释渲染字符串模板的链接,而不是渲染模板文件。
https://docs.djangoproject.com/en/1.7/ref/templates/api/#rendering-a-context