带有 Jinja2 的 Django 1.8:Contrib 应用程序管理员不起作用

Posted

技术标签:

【中文标题】带有 Jinja2 的 Django 1.8:Contrib 应用程序管理员不起作用【英文标题】:Django 1.8 with Jinja2: Contrib app Admin not working 【发布时间】:2015-06-07 19:54:47 【问题描述】:

我升级到全新安装的 Django 1.8 并开始使用 Jinja2,因为它说它现在受支持,而且 Jinja2 有一些我可以在我的项目中使用的功能。

在将我的应用的模板适应 Jinja2 并利用现在可用的新功能后,我发现 contrib 应用 Admin 不再工作。

"TemplateDoesNotExist at /admin/login/"

事实证明,contrib app Admin 只有为 DjangoTemplates 而不是为 Jinja2 制作的模板。我首先做了一件天真的事情,并在[...]/site-packages/django/contrib/admin 中创建了一个从templatesjinja2 的符号链接,但是模板使用的是DjangoTemplates 细节,所以Jinja2 不会接受它们。我删除了符号链接。

我切换到 Jinja2 的方式是在我的项目 settings.py 中进行以下更改:

 TEMPLATES = [
     
-        'BACKEND': 'django.template.backends.django.DjangoTemplates',
+        'BACKEND': 'django.template.backends.jinja2.Jinja2',
         'DIRS': [],
         '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',
-            ],
-        ,
     ,
 ]

有人知道吗:

    如何让 contrib 应用 Admin 继续使用 DjangoTemplates,同时让我自己的应用使用 Jinja2,或者 如果有另一个支持 Jinja2 的管理应用程序与默认应用程序一样好,或 是否还有其他我忽略或应该注意的事项?

感谢您的宝贵时间:)

【问题讨论】:

【参考方案1】:

理想的解决方案是让默认模板系统优先于 Jinja 系统。唯一的区别是指定的DIRS 需要不同。如果您只关心管理员,则该过程相当简单。

TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [], # This is particularly important as it will not look into the default template directory
    ,
    
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
    ,
]

请记住,目录结构不得允许默认模板系统访问您的主页。

【讨论】:

【参考方案2】:

管理应用不附带 Jinja2 模板。您需要将项目配置为使用 Django 和 Jinja2 模板。

Django template docs 有以下示例。

TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            '/home/html/example.com',
            '/home/html/default',
        ],
    ,
    
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [
            '/home/html/jinja2',
        ],
    ,
]

【讨论】:

我主要听从了您的建议,效果很好。我所做的不同之处在于我将 Jinja2 放在 DjangoTemplates 之前而不是之后,因为在正常操作中,它是最经常是正确的模板引擎,也不是像你的示例中那样提供 DIRS,我将它们保留为默认值(空列表) 并包含其他一些默认值。

以上是关于带有 Jinja2 的 Django 1.8:Contrib 应用程序管理员不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有缓存加载器的 Jinja2 与 django 模板 - 性能比较如何?

带有 jinja2 模板的 django allauth

从 Django 1.6 (with south) 升级到 1.8 不会修改用户表上的“last_login”

如何正确应用 django/jinja2 模板过滤器“转义”和“换行符”?

Django 1.8 和 Rest Framework 3.7 的“导入错误:没有名为 urls 的模块”

Django(28)Django模板介绍