关于如何在 django 2.2.7 版本更换模板引擎为 jinja2
来源:3-7 jinja2配置与使用方法

秋荏苒
2019-11-16
我尝试在 2.2.7 版本的 django 中通过老师视频中的方法更换模板引擎为 jinja2,但是显然这是不行的,直接更换模板导致报错
?: (admin.E403) A 'django.template.backends.django.DjangoTemplates' instance must be configured in TEMPLATES in order to use the admin application.
根据报错提示,应该是 django 自带的 admin 模块需要使用 django 默认模板。
这里提供两种解决的思路,在 2.2.7 版本更换模板引擎。
1. 不使用 admin 模块
实际上根据报错,很直观的想到的就是如果不用这个 admin 后台模块,不就可以解决这个了吗?
所以只需要在修改如下三处代码即可禁用掉和 admin 模块有关的内容
# project_name/settings.py
INSTALLED_APPS = [
# 注释掉 admin 应用
# 'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app',
]
# app/admin.py
# 注释掉对 admin 的导入
# from django.contrib import admin
# Register your models here.
# project_name/urls.py
# 同样注释掉对 admin 的引用
# from django.contrib import admin
from django.urls import path, include
from app import urls as app_urls
urlpatterns = [
path('admin/', admin.site.urls),
path('app/', include(app_urls))
]
修改好上述三处代码之后,老师课上的修改模板的引擎的方法就可以正常使用了。
2. 共存
实际上上述方法并没有解决根本问题,因为 django 文档中显然是提到了模板引擎的共存,那么既然可以共存自然就可以在保留 admin 模块的前提下,使用 jinja2 模板引擎了。
所以我尝试在原本的模板设置中,添加了一个 jinja2 的模板引擎设置,就是下面这样的
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',
],
"environment": "one.jinja2_env.environment"
},
},
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'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',
],
},
},
]
服务器可以正常启动了,但是显然这种方式是有问题的,jinja2 引擎根本没有生效。
按照之前课上的内容,django 默认将 templates 文件夹下的内容识别为模板,那么在多个模板引擎共存的情况下,templates 文件夹下的模板还是由 django 自带的模板引擎管理的,那么我想,只需要给 jinja2 模板引擎单独指定一个存放模板的路径就好了。
通过这种方式,就可以解决多个模板引擎共存的问题,且只需要将不同模板引擎对应的模板放入各自指定的模板路径中,就可以使用不同的模板引擎,互相并不干扰。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
# 只需要在应用下或者项目根目录中创建一个 jinja2 文件夹,然后存放需要使用 jinja2 模板引擎的模板即可
# 视图函数一样可以正确识别模板路径,不会出现问题
'DIRS': [os.path.join(BASE_DIR, "jinja2")],
'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',
],
"environment": "one.jinja2_env.environment"
},
},
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'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',
],
},
},
]
以上就是我在 2.2.7 版本的 django 中使用 jinja2 模板引擎的方案。
这里还特别提示一下,我在另外一个提问中,看到说 pycharm 直接创建 django 项目指定 jinja2 做模板语言可以解决这个问题,我试了下,并不可以,如果勾选了 use admin,也就是启动 admin 模块,那么还是会报错,实际上观察代码,pycharm 不过是自动将 settings.py
中的模板配置修改了成了 jinja2 的,并没有让模板得以共存。
2回答
-
systemuser
2019-11-22
测试了下,需要为jinja与DjangoTemplate指定不同的模板路径即可,或者将template加入jinja的dirs,djangotemplate保持为空,均不指定文件夹会出现楼主方法二jinja不生效的问题
环境:python3.6.5 django2.2.6
00 -
deweizhang
2019-11-16
谢谢你的补充 django在不同版本的确会有不同 这也是django一直以来的问题—升级困难 兼容问题
042019-11-16
相似问题