如何设置 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')