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模板引擎渲染模板成功了。

posted @ 2021-01-18 17:11  syushin  阅读(807)  评论(1编辑  收藏  举报