我有一个 Django (v1.10.6) 项目,其中包含一些带有日期时间字段的模型,例如:
created_at = models.DateTimeField(auto_now_add=True)
存储在没有时区信息的 PostgreSQL 数据库中:
created_at timestamp without time zone NOT NULL
postgresql.conf
:
timezone = 'UTC'
我希望我的应用程序的所有日期都显示在America/Bogota
时区中(它不应该取决于用户的实际时区),所以我的settings.py
文件具有以下配置:
TIME_ZONE = 'America/Bogota'
USE_I18N = False
USE_L10N = True
USE_TZ = True
SHORT_DATETIME_FORMAT = 'd-m-Y H:i:s'
SHORT_DATE_FORMAT = 'd-m-Y'
TIME_FORMAT = 'H:i:s'
但是当我写
{{ object.created_at|date:'SHORT_DATETIME_FORMAT' }}
在模板中,它仍然以UTC
格式显示日期。
更新:
我添加了以下中间件,但没有帮助:
class TimezoneMiddleware(MiddlewareMixin):
def process_request(self, request):
timezone.activate(pytz.timezone(settings.TIME_ZONE))
更新 2:
它的工作方式如下:
import pytz
from django.utils import timezone
timezone.is_naive(object.created_at) # True
object.created_at.replace(tzinfo=timezone.utc)
(强制日期在UTC
时区,然后将其传递给没有localize
过滤器的模板)但我不明白为什么 Django 在USE_TZ
设置为True
.