Django-Templated-Email:从不同文件导入时出现TemplateDoesNotExist
我有一个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_DIR
和TEMPLATED_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 个回答
你不应该把一个应用里的视图导入到另一个应用的视图里。可以试着为你的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)
无论哪个应用调用它,这个函数都能发送邮件。