我尝试在 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 版本更换模板引擎。
实际上根据报错,很直观的想到的就是如果不用这个 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))
]
修改好上述三处代码之后,老师课上的修改模板的引擎的方法就可以正常使用了。
实际上上述方法并没有解决根本问题,因为 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 的,并没有让模板得以共存。