Django使用Jinja2模板引擎
Django中,默认是使用DjangoTemplates来渲染模板,叫做DTL,可以将模板引擎更换为Jinja2
更换模板引擎步骤:
安装Jinja2
要使用Jinja2,就需要有Jinja2的环境。一般Django是运行在虚拟环境中的,在虚拟环境中用pip命令安装Jinja2。
pip install jinja2
创建jinja2环境变量文件
在项目根目录下,创建jinja2的环境变量文件,一般创建在与 setting.py
文件的同级目录中,文件名可以自定义(只要能找到即可),如 jinja2_env.py
文件内容如下:
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
from jinja2 import Environment
def environment(**options):
env = Environment(**options)
env.globals.update({
'static': staticfiles_storage.url,
'url': reverse,
})
return env
修改setting.py 文件
Django模板引擎的配置是在 setting.py
文件的 TEMPLATES
项。下面是配置Jinja2模板引擎和DTL模板引擎一起的配置:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [BASE_DIR / 'jinja2_templates'], # 在项目根目录创建个同名目录
'APP_DIRS': True,
'OPTIONS': {
'environment': "django_day02.jinja2_env.environment", # 使用jinja2_env.py定义的环境变量
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [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',
],
},
},
]
注意:
Django默认生成的项目,有一个后台网站APP,也就是 django.contrib.admin
。这个APP里面用到了DTL模板引擎,所以当更换引擎为Jinja2的时候,如果把原先的DTL引擎注释掉了,会报如下错误:
?: (admin.E403) A 'django.template.backends.django.DjangoTemplates' instance must be configured in TEMPLATES in order to use the admin application.
所以,可以让DTL和Jinja2模板引擎共存。共存的话,还有个注意点:不修改原有引擎配置,新增引擎jinja2的时候,一定要把jinja2 引擎放在前面, 否则默认生效的还是django模板引擎。
测试使用Jinja模板引擎
定义模板 jinja2_templates\App\jinja2.html
,内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jinja2模板</title>
</head>
<body>
{{ 1+3 }} {# jinja的语法,支持直接写表达式 #}
{% for i in range(10) %} {# jinja的语法,支持直接range函数 #}
<li>{{ i }}</li>
{% endfor %}
</body>
</html>
路由和视图函数
# 路由
path('jin/', views.load_jinja2, name="jin")
# 视图函数
def load_jinja2(request):
return render(request, 'App/jinja2.html')
浏览器访问效果:
可以看到,Django使用Jinja2模板引擎渲染模板成功了。