如何设置 django 1.8 以使用 jinja2?
How to setup django 1.8 to use jinja2?
所以,既然 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')
要考虑的另一件事是 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,
}
应用程序目录的 Jinja 模板文件夹默认为 jinja2
而不是标准 templates
文件夹。
因此请尝试以下目录结构,Django 将找到您的 Jinja 模板:
mysite
mysite
myapp
jinja2
myapp
index.html
manage.py
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
。
应用程序目录的 Jinja 模板文件夹默认为 jinja2 而不是标准模板文件夹。
因此请尝试以下目录结构,Django 将找到您的 Jinja 模板:
我的网站
我的网站
我的应用程序
jinja2
我的应用
index.html
manage.py
而不是:
return 渲染(请求,'myapp/index.html')
你应该写:
return 渲染(请求,'index.html')
所以,既然 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')
要考虑的另一件事是 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,
}
应用程序目录的 Jinja 模板文件夹默认为 jinja2
而不是标准 templates
文件夹。
因此请尝试以下目录结构,Django 将找到您的 Jinja 模板:
mysite
mysite
myapp
jinja2
myapp
index.html
manage.py
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
。
应用程序目录的 Jinja 模板文件夹默认为 jinja2 而不是标准模板文件夹。
因此请尝试以下目录结构,Django 将找到您的 Jinja 模板:
我的网站
我的网站
我的应用程序
jinja2
我的应用
index.html
manage.py
而不是: return 渲染(请求,'myapp/index.html') 你应该写: return 渲染(请求,'index.html')