在django

时间:2017-10-23 14:10:30

标签: python django

我在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"
    )

2 个答案:

答案 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