【问题标题】:How to setup django 1.8 to use jinja2?如何设置 django 1.8 以使用 jinja2?
【发布时间】:2015-07-29 01:56:38
【问题描述】:

所以,既然 django 正式支持 Jinja 2 作为模板引擎,我希望启用它就像在 config.xml 中切换一行一样简单。但是当我这样做时,jinja 找不到我的模板。

我的理解是我可以手动配置一个目录列表以供它在其中查找模板,但我希望它的行为与默认情况下 DTL 的行为完全相同。 (即查看 /templates 目录)。基本上,我的应用程序是按照官方教程中建议的方式构建的,我想在不更改任何其他内容的情况下使用 jinja。有可能吗?

这是我的 settings.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')

【问题讨论】:

  • 您能否在视图中向我们展示您调用模板的代码?
  • @StvnW 已添加到问题中。
  • Se this answer,我认为这对您的问题有所帮助。
  • @doru 谢谢,确实如此。

标签: python django python-3.x jinja2


【解决方案1】:

应用程序目录的 Jinja 模板文件夹默认为 jinja2,而不是标准的 templates 文件夹。

所以试试下面的目录结构,Django 会找到你的 Jinja 模板:

mysite
    mysite
    myapp
        jinja2
            myapp  
                index.html
    manage.py

【讨论】:

    【解决方案2】:

    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】:

      要考虑的另一件事是 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,
      }
      

      【讨论】:

        【解决方案4】:

        应用程序目录的 Jinja 模板文件夹默认为 jinja2 而不是标准模板文件夹。

        所以试试下面的目录结构,Django 会找到你的 Jinja 模板:

        我的网站 我的网站 我的应用 神社2 我的应用程序
        索引.html 管理.py

        而不是: 返回渲染(请求,'myapp/index.html') 你应该写: 返回渲染(请求,'index.html')

        【讨论】:

          猜你喜欢
          • 2016-10-09
          • 2015-08-22
          • 2016-02-24
          • 2013-06-02
          • 2017-10-17
          • 2015-07-15
          • 2016-06-26
          • 2021-01-25
          • 2017-04-06
          相关资源
          最近更新 更多