Django使用Jinja2时开启本地化和时区

Django自带的本地化和时区功能,对于面向全球的网站来说十分好用。但官方教程仅仅提及了如何在Django Template中使用,如果要切换成Jinja2就需要额外一些工作。

文件配置

我的myproject/settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': 'myproject.jinja2.environment',
            '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': [],
        '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',
            ],
        },
    }
]

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = True

我的myproject/jinja2.py

from django.templatetags.static import static
from django.templatetags.l10n import localize
from django.templatetags.tz import localtime
from django.urls import reverse

from jinja2 import Environment


def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': static,
        'url': reverse,
    })
    env.filters['localize'] = localize
    env.filters['localtime'] = localtime
    return env

文件讲解

对于settings.py文件没什么好说的,根据官方教程走都一样的。而对jinja2.py文件,我们从Django中导入了localize和localtime函数并添加为Jinja2的过滤器。不添加为标签的原因是过滤器可以多个嵌套,比如下面:

{{ nomox }}# 2020-10-04 05:03:21.435128+00:00
{{ nomox | localtime }} # 2020-10-04 13:03:21.435128+08:00
{{ nomox | localize }} # 2020年10月4日 05:03
{{ nomox | localtime | localize }} # 2020年10月4日 13:03

这样Jinja2就可以通过两个过滤器将UTC时间转化为了本地日期和文字,可以说非常方便了。