请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于如何在 django 2.2.7 版本更换模板引擎为 jinja2

我尝试在 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 的,并没有让模板得以共存。

正在回答 回答被采纳积分+3

2回答

systemuser 2019-11-22 17:37:27

测试了下,需要为jinja与DjangoTemplate指定不同的模板路径即可,或者将template加入jinja的dirs,djangotemplate保持为空,均不指定文件夹会出现楼主方法二jinja不生效的问题

环境:python3.6.5 django2.2.6

0 回复 有任何疑惑可以回复我~
deweizhang 2019-11-16 20:31:40

谢谢你的补充 django在不同版本的确会有不同 这也是django一直以来的问题—升级困难 兼容问题

0 回复 有任何疑惑可以回复我~
  • 提问者 秋荏苒 #1
    谢谢老师,感觉 django 很不友好..一点小问题,折腾了几个小时,官方文档写的也不清不楚..也许他们并不希望开发者使用其它模板吧..
    回复 有任何疑惑可以回复我~ 2019-11-16 20:34:35
  • deweizhang 回复 提问者 秋荏苒 #2
    django从1.0开始就有这个问题。很多团队都给django团队提过这个问题,但一直没有改善
    回复 有任何疑惑可以回复我~ 2019-11-16 20:35:48
  • 提问者 秋荏苒 回复 deweizhang #3
    老师,关于静态文件的调用,依然可以通过这种方式调用静态文件
    `<link rel="stylesheet" href="{{ static('app/index.css') }}">`
    
    只需要将模板环境中的 static 写成下面这样就行了
    
    ```py
    from jinja2 import Environment
    from django.templatetags.static import static
    # from django.contrib.staticfiles.storage import staticfiles_storage
    from django.urls import reverse
    from .myfilter import for_test
    
    
    def environment(**options):
        env = Environment(**options)
        env.globals.update({
            "static": static,
            # "static": staticfiles_storage,
            "url": reverse
        })
        env.filters["for_test"] = for_test
        return env
    ```
    回复 有任何疑惑可以回复我~ 2019-11-16 20:48:17
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信