在 Django 模板中应用本地时区

Applying local timezone in Django templates

我使用 Django 3.1.7 和 postgreSQL 作为数据库。

问题来了,在我的数据库中保存了一个日期后,我尝试在模板中显示访问者的时区,但它仍然显示 UTC 日期。

我的 settings.py 中有这些值:

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

我的模特:

class Log(models.Model):
    user = models.ForeignKey(to=User, on_delete=models.PROTECT)
    log = models.CharField(max_length=255)
    type = models.CharField(max_length=50)
    date = models.DateTimeField(auto_now_add=True)
    company = models.ForeignKey(to=Company, on_delete=models.PROTECT)

我的上下文处理器正在获取对象:

def logs_processor(request):
    if request.user.has_perm('loging.can_see_logs'):
        try:
            logs = Log.objects.filter(company=request.user.company).order_by('-date')[:50]
        except TypeError:
            logs = None
        return {'side_logs': logs}
    else:
        return {'side_logs': []}

还有我的模板:

{% load tz %}
{% for log in side_logs %}
   {{ log.date|localtime }}
{% endfor %}

我尝试不使用 |localtime,但没有成功。

当我像 log.date|timezone:"Europe/Paris" 这样手动指定 TZ 时效果很好。

此外,我准确地说我已经安装了 pytz

这是我的日期在数据库中的样子(看起来它们并不幼稚,并按计划放置在 UTC 上): 2021-03-10 04:10:11.849048 +00:00

有什么想法吗?

localtime filter says that it "enables or disables conversion of aware datetime objects to the current time zone". The current time zone is defined 的文档是通过调用 activate() 显式设置的文档,否则,就是 TIME_ZONE 设置的值。

您没有调用 activate()TIME_ZONE 设置的值为 UTC,因此您会看到 UTC 中的值。

如果您的目标是使用“访问者的时区”,您将不得不做更多的工作,因为服务器无法自动知道用户想要使用的时区。文档 discusses this,并提供了一些您可以如何操作的示例。