Django之Jinja2模板配置错误

jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用,所以很多人即使使用Django进行开发,也会选择使用jinja2.

Jinja2有以下优点:

  1. 相对于Template,jinja2更加灵活,它提供了控制结构,表达式和继承等。
  2. 相对于Mako,jinja2仅有控制结构,不允许在模板中编写太多的业务逻辑。
  3. 相对于Django模板,jinja2性能更好。
  4. Jinja2模板的可读性很棒。

配置Jinja2环境变量

Jinja2不支持Django默认模板引擎自带的url 和static语法,我们为了使其支持,要自己添加这个环境变量。

自定义环境变量

自定义Jinja2环境变量文件及函数,本人直接创建目录为项目目录下的utils/jinja2_env.py文件中定义的jinja2_env函数:

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/11/6 11:05
# @Author : 托小尼
# @Email : 646547989@qq.com
# @URI : https://www.diandian100.cn
# @File : jinja2_env.py
# Jinja2模板引擎环境配置
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
from jinja2 import Environment


def jinja2_env(**kwargs):
"""
使模板引擎可以使用{{ url('') }}和{{ static('') }}语句
:return:
"""
env = Environment(**kwargs)
env.globals.update({
'static': staticfiles_storage.url,
'url': reverse
})
return env

setting文件中配置Jinja2模板引擎

默认用的是Django默认的模板引擎,我们这里替换成Jinja2的,并将环境变量写入其中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TEMPLATES = [
# 修改django默认的模板引擎为Jinja2
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'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引擎环境,使其支持{{ url('') }}和 {{ static('') }}
'environment': 'mall_project.utils.jinja2_env.jinja2_env',
},
},
]

配置Jinja2报错

以上配置后,我们运行该项目,直接报错,报错信息如下:

1
2
3
4
5
6
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
?: (admin.E403) A 'django.template.backends.django.DjangoTemplates' instance must be configured in TEMPLATES in order to use the admin application.

System check identified 1 issue (0 silenced).

大意是必须配置Django的默认模板引擎DjangoTemplates,那我们就配置上呗,配置在Jinja2后面总没错吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
TEMPLATES = [
# 修改django默认的模板引擎为Jinja2
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'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引擎环境,使其支持{{ url('') }}和 {{ static('') }}
'environment': 'mall_project.utils.jinja2_env.jinja2_env',
},
},
{
'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',
],
},
},
]

再次运行项目,完美!!!