gpt4 book ai didi

python - 即使在设置中配置,Django 也找不到我的模板目录?

转载 作者:行者123 更新时间:2023-12-03 16:30:59 25 4
gpt4 key购买 nike

我正在尝试为 django 邮件模块使用 HTML 模板。我当前的问题是我收到此错误:

django.template.exceptions.TemplateDoesNotExist
当我尝试在名为 users 的应用程序中渲染 HTML 时:
html = render_to_string('email/email_confirm.html', context)
这是我的文件夹布局,我的应用程序称为用户,我的项目设置位于 /core .我的模板位于 BASE_DIR。
enter image description here
这是我在设置中的模板代码:

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'social_django.context_processors.backends',
'social_django.context_processors.login_redirect',
],
},
},
]

如何让 Django 正确找到模板文件夹?我的所有应用程序都已连接,数据工作正常。这严格来说是一个模板路径问题。
编辑:
我保留了我的 APP_DIRS = True 并将模板/电子邮件文件夹移动到用户应用程序文件夹中。
还是 django 没有找到模板?
这是有问题的 View.py:

class CustomUserCreate(APIView):
permission_classes = [AllowAny]

def post(self, request, format='json'):
serializer = CustomUserSerializer(data=request.data)

if serializer.is_valid():
user = serializer.save()
if user:
# GENERATE EMAIL CONFIRMATION TOKEN
user_data = serializer.data
user = User.objects.get(email=user_data['email'])

token = RefreshToken.for_user(user).access_token

# GENERATE EMAIL CONFIRMATION TEMPLATE
current_site = get_current_site(request).domain
relative_link = reverse('users:email-verify')


# CHANGE TO HTTPS in PRODUCTION
absurl = 'http://'+current_site+relative_link+"?token="+str(token)
email_body = 'Hi '+ user.username+', Please use link below to verify your email \n' + absurl

context = {
'name': user.first_name,
}
html = render_to_string('email/email_confirm.html', context)
text = render_to_string(email_body, context)


data = {'to_email':user.email,
'email_subject': 'Verify your email',
'email_body':email_body,
'message':text,
'html_message':html
}


Util.send_email(data)

return Response(user_data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
编辑2:
首先我尝试这样做:
template = get_template('email/email_confirm.html', { 'name': user.first_name})
我得到了 TypeError: unhashable type: 'dict'作为上述错误。
然后我把它转过来这样做:

absurl = 'http://'+current_site+relative_link+"?token="+str(token)
email_body = 'Hi '+ user.username+', Please use link below to verify your email \n' + absurl

context = {
'name': user.first_name,
}

template = get_template('email/email_confirm.html')

email = render_to_string(template, context)


data = {'to_email':user.email,
'email_subject': 'Verify your email',
'email_body':email_body,
'html_message':email
}


Util.send_email(data)

导致此错误:
    raise TypeError(f'{funcname}() argument must be str, bytes, or '
TypeError: join() argument must be str, bytes, or os.PathLike object, not 'Template'
最后编辑:
                data = {'to_email':user.email,
'email_subject': 'Please Verify Your Email',
'email_body':email_body,
'html_message':html
}

最佳答案

注意 render_to_string 的参数是模板的路径和上下文字典。从根本上说,问题是确保您将模板路径传递给 render_to_string每次调用它。
在您的第一篇文章中,问题不在于您突出显示的行
( html = render_to_string('email/email_confirm.html', context) ),该行实际上完全没有问题,而不是您的错误的根源。而是以下行,其中 render_to_string 的第一个参数是电子邮件正文的字符串:text = render_to_string(email_body, context) .由于email_body,此处无需进行渲染。已经是一串内容了。您可以完全删除该行并使用 email_body而不是 text在您的代码中的其他地方。
或者,您可以为电子邮件的文本正文创建一个新模板(可能是 email/email_confirm.txt )并呈现它,而不是使用字符串连接来创建 email_body .
在编辑中,这个顺序是有问题的:

                template = get_template('email/email_confirm.html')

email = render_to_string(template, context)
自从 render_to_string获取模板的路径,而不是模板本身。 get_template 的事实此处工作只是说明您的模板设置工作正常, email = render_to_string('email/email_confirm.html', context)从一开始就不是问题,而且有点像红鲱鱼。使用 text = render_to_string(email_body, context) 解决问题后行原始代码以创建 html变量很好。

关于python - 即使在设置中配置,Django 也找不到我的模板目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67066334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com