Django-Templated-Email:从不同文件导入时出现TemplateDoesNotExist

1 投票
1 回答
765 浏览
提问于 2025-04-17 09:21

我有一个Django项目,里面有两个应用:email_app和landing_page_app。landing_page_app.views中引入了email_app.views,这样它就可以使用new_lead_email这个函数。

email_app.views中:

from datetime import datetime
from templated_email import send_templated_mail

def new_lead_email(email):
    send_templated_mail(
        template_name='new_lead',
        from_email='name@somewhere.com',
        recipient_list=['name@somewhere.com'],
        context={
            'email': email,
            'current_time': str(datetime.now()),
            },
    )

landing_page_app.views中:

from email_app.views import new_lead_email
new_lead_email(email)

我遇到了一个“TemplateDoesNotExist”的错误,提示找不到“templated_email/new_lead.txt”。当new_lead_email函数没有被引入到landing_page_app.views中时,它是可以正常工作的(也就是说,如果我直接在email_app.views中调用new_lead_email,它就没问题)。

在settings.py文件中,我把TEMPLATED_EMAIL_TEMPLATE_DIRTEMPLATED_EMAIL_FILE_EXTENSION设置为一个包含“new_lead.email”模板的目录。这表明django-templated-email中的vanilla_django.py文件(https://github.com/bradwhittington/django-templated-email/blob/master/templated_email/backends/vanilla_django.py)没有正确导入我的settings.py文件。

你有什么建议可以让我在其他文件中导入email_app.views中的函数,并让模板正常工作吗?非常感谢bradwhittington提供的这个非常有用的Django类。我期待着学习如何正确使用它!

1 个回答

0

你不应该把一个应用里的视图导入到另一个应用的视图里。可以试着为你的email_app创建一个utils.py文件,把你的函数放在里面。我现在就是这样做的,为一个项目写了一个通用的发送邮件的函数,使用的是项目根目录下的globalutils.py文件。这个函数可以从我在templates/email/文件夹里的模板中发送文本或HTML格式的邮件,这个文件夹也是在项目的根目录下。

下面是这个方法的前几行代码

def send_message(template_name, subject_context, body_context, recipients, sender=None, send_email=True, send_internal=True):

subject = render_to_string("%s/%s_%s.%s" % ("email", template_name, "subject", "txt"), subject_context)
t_html = render_to_string("%s/%s_%s.%s" % ("email", template_name, "body", "html"), body_context)
t_text = strip_tags(t_html)

无论哪个应用调用它,这个函数都能发送邮件。

撰写回答