我在Django模型中有以下Python代码,可以将电子邮件发送给'所有者'该模型。我希望管理员能够上传将要使用的文件(如果已上传),或者如果尚未加载则将使用默认模板文件。这是代码:
def send_invitation(self):
'''
sends an invitation from admin to accept a listing
'''
try:
if self.user or not self.email : return False
except :
try: email_body_template = Parameter.objects.get(name='send_invitation_email.txt').f
except: email_body_template = 'listing_cms_integration/email/send_invitation_email.txt'
try: email_subject_template = Parameter.objects.get(name='send_invitation_email_subject.txt').f
except: email_subject_template = 'listing_cms_integration/email/send_invitation_email_subject.txt'
context = Context()
context['listing'] = self
context['site'] = Site.objects.get_current().domain
subject = render_to_string(email_subject_template, context)
message = render_to_string(email_body_template, context)
email = EmailMessage(subject, message, to=[self.email])
email.send()
return True
如果我没有名为' send_invitation_email.txt'然后它工作正常。当按照指定选择参数时,我收到以下错误。
强制转换为Unicode:需要字符串或缓冲区,找到FieldFile
如何将用户上传的文件转换为可用作电子邮件模板的文件?
修改
添加参数模型
class Parameter (models.Model):
name = models.CharField(
verbose_name = 'Title',
max_length = 255,
unique=True,
)
description = models.TextField()
f = models.FileField (
verbose_name = 'Input File',
help_text = "Email body template"
)
答案 0 :(得分:0)
您已发送到render_to_string()函数文件实例而不是字符串。 试试这个:
undefined
答案 1 :(得分:0)
这就是我做到的。
我已将MEDIA_ROOT
添加到TEMPLATES
DIRS
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
...
os.path.join(MEDIA_ROOT),
],
'OPTIONS': {
我改变了函数以获取文件名
email_body_template = Parameter.objects.get(name='send_invitation_email.txt').f.name