所以,既然django正式支持Jinja 2作为模板引擎,我希望启用它就像在配置中切换一行一样简单。但是当我这样做时,jinja找不到我的模板。
我的理解是我可以手动配置目录列表以便查找模板,但我希望它的行为与默认情况下的DTL行为完全相同。 (即查看/ templates目录)。基本上,我的应用程序的结构与官方教程中的建议方式相同,我想在不改变任何其他内容的情况下使用jinja。有可能吗?
以下是我的setings.py文件现在的样子:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'APP_DIRS': True,
},
]
我得到的错误是TemplateDoesNotExist at /
这是我的目录结构:
mysite
mysite
myapp
templates
myapp
index.html
manage.py
请注意,我希望不要使用任何外部模块。
根据要求编辑,这是调用模板的代码:
def index(request):
return render(request, 'myapp/index.html')
答案 0 :(得分:7)
app dirs的Jinja模板文件夹默认为jinja2
而不是标准templates
文件夹。
请尝试以下目录结构,Django将找到您的Jinja模板:
mysite
mysite
myapp
jinja2
myapp
index.html
manage.py
答案 1 :(得分:1)
要考虑的另一件事是render_to_response不能为jinja2模板采用context_instance
https://github.com/django-haystack/django-haystack/issues/1163
我相信,但我可能错了,但我认为jinja2不能与django模板共享同一目录。 尝试
TEMPLATES = {
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(PROJECT_ROOT, 'jinja2'),],
'APP_DIRS': True,
}
答案 2 :(得分:1)
Jinja2模板后端搜索应用目录中的jinja2
文件夹,而不是templates
。这有利于防止DTL和Jinja2模板混淆,特别是如果在项目中启用多个模板引擎。
我建议坚持使用默认行为,并将templates
目录重命名为jinja2
。但是,如果您必须更改它,则可以创建自定义后端,并设置app_dirname
。
from django.template.backends.jinja2 import Jinja2
class MyJinja2(jinja2):
app_dirname = 'templates'
然后在TEMPLATES
设置中,使用path.to.MyJinja2
代替django.template.backends.jinja2.Jinja2
。
答案 3 :(得分:0)
app dirs的Jinja模板文件夹默认为jinja2而不是标准模板文件夹。
请尝试以下目录结构,Django将找到您的Jinja模板:
mysite的
我的网站
MYAPP
Jinja2的
MYAPP
的index.html
manage.py
而不是: return render(request,' myapp / index.html') 你应该写: return render(request,' index.html')