使用Django的EmailMultiAlternatives后页面渲染邮箱显示异常
解决Django中EmailMultiAlternatives导致模板渲染邮箱显示为对象的问题
问题原因
你在视图代码中犯了变量覆盖的错误:原本存储用户邮箱字符串的email变量,被重新赋值给了EmailMultiAlternatives的实例对象。当你把这个被覆盖后的email传入模板时,模板渲染的自然是邮件对象的字符串表示(也就是你看到的<django.core.mail.message.EmailMultiAlternatives object at ...>),而非原始的用户邮箱地址。
修复方案
只需要避免覆盖原始邮箱变量即可,两种简单实现方式:
方式1:重命名邮件对象变量
把EmailMultiAlternatives实例的变量名改成和原始邮箱变量不同的名称,比如email_msg:
# html email configuration html_content = render_to_string("basecamp/html_email-inquiry.html", {'name': name, 'contact': contact, 'email': email, 'message': message,}) text_content = strip_tags(html_content) # 重命名邮件对象变量,避免覆盖原始邮箱 email_msg = EmailMultiAlternatives( "Inquiry", text_content, '', [email] # 依然使用原始邮箱变量 ) email_msg.attach_alternative(html_content, "text/html") email_msg.send() return render(request, 'basecamp/inquiry_details.html', {'name' : name, 'email': email, }) # 这里的email仍是原始邮箱字符串
方式2:提前保存原始邮箱到新变量
如果不想修改邮件对象变量名,可提前把原始邮箱存到新变量中:
# 提前保存原始邮箱 user_email = email # html email configuration html_content = render_to_string("basecamp/html_email-inquiry.html", {'name': name, 'contact': contact, 'email': user_email, 'message': message,}) text_content = strip_tags(html_content) email = EmailMultiAlternatives( "Inquiry", text_content, '', [user_email] ) email.attach_alternative(html_content, "text/html") email.send() return render(request, 'basecamp/inquiry_details.html', {'name' : name, 'email': user_email, }) # 返回保存好的原始邮箱
验证修改
修改后,模板中的{{ email }}会正确渲染为用户的邮箱地址,而非邮件对象的字符串表示。
内容的提问来源于stack exchange,提问作者Peter Kam
相关产品推荐
相关产品推荐

