【问题标题】:Display a timestamp with timezone in Django admin在 Django admin 中显示带有时区的时间戳
【发布时间】:2020-01-20 21:03:55
【问题描述】:

我有一个具有时区感知的模型DateTimeField。每个对象可能使用不同的时区。我希望 Django Admin 以时区后缀(EST 等)显示此字段,而不是用户或服务器的本地时间。

我不想全局修改我的项目的时区本地化设置。这应该只适用于这一领域。

This question 涉及类似的东西,但我对解决方案持怀疑态度;它在初始化对象类时激活一个新的时区,这不允许更改每行的时区,并影响不是我感兴趣的特定字段的其他时间戳。

【问题讨论】:

    标签: django timezone


    【解决方案1】:

    一种方法是将timestamp 字段替换为我们手动处理时区的计算字段:

    class EventInline(admin.TabularInline):
        model = Event
        readonly_fields = ('timestamp_local',)
    
        def get_fields(self, request, obj=None):
            fields = super().get_fields(request, obj=obj)
            fields.remove('timestamp_local')
            fields[fields.index('timestamp')] = 'timestamp_local'
            return fields
    
        def timestamp_local(self, obj):
            d = obj.timestamp
            return (f'{d.strftime("%b")} {d.day}, {d.year} at '
                    f'{d.strftime("%H:%M:%S %Z")}')
    
        timestamp_local.short_description = 'timestamp'
    

    我尝试使用 Django 的时区支持和 dateformat 实用程序模块,但遇到了一些问题。 (Django Admin 的其余部分是否也在使用这些?更新 DATETIME_FORMAT 不会改变 Admin 呈现时间戳的方式。)

    但是,日期似乎被存储为 UTC,并且时区信息丢失了。我不得不单独存储时区,并使用obj.timestamp.astimezone(pytz.timezone(obj.timestamp_tz))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-17
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多