在 Django 模板中应用本地时区

问题描述 投票:0回答:2

我使用 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 %}

我在没有|当地时间的情况下尝试过,但没有成功。

当我手动指定 TZ 时,如

log.date|timezone:"Europe/Paris"
效果很好。

我也明确表示我已经安装了

pytz

这是我的日期在数据库中的样子(看起来它们并不天真,并且按计划放置在 UTC 上):

2021-03-10 04:10:11.849048 +00:00

有什么想法吗?

django django-models django-templates timezone
2个回答
0
投票

localtime
过滤器的文档说它“启用或禁用感知日期时间对象到当前时区的转换”。 当前时区定义为通过调用
activate()
显式设置的时区,或者,如果失败,则为
TIME_ZONE
设置的值。

您没有调用

activate()
,并且
TIME_ZONE
设置的值为
UTC
,因此您会看到
UTC
中的值。

如果您的目标是使用“访问者的时区”,您将不得不做更多的工作,因为服务器无法自动知道用户想要使用哪个时区。该文档讨论了这一点,并给出了一些如何做到这一点的示例。


0
投票

基本上,转到

<app>/settings.py
,然后将
TIME_ZONE
值从
UTC
更改为您自己的本地时区。 Django 将处理显示您本地的日期时间。

来自

TIME_ZONE="UTC"

进入

TIME_ZONE="Asia/Taipei"

无需模板标签和过滤器

<td>{{ date }}</td>
© www.soinside.com 2019 - 2024. All rights reserved.