如何更改特定 Django 管理模型中的时区?

How to change the timezone in the particular Django admin Model?

我想在 Django admin 的一个特定模型中更改时区,我该怎么做?

由于 Django 在数据库中以 UTC 保存时间,我想要的是在特定时区显示值,仅针对一个模型。不适用于整个项目。

例如我有一个模型:

class Student(models.Models)
    created_at = models.DateTimeField()    

当我为此模型打开 Django Admin 时,我想查看特定时区的时间(比如说 ETC),但让 Django 以 UTC 保存时间。

所以我找到了解决方案:为了完成我想完成的事情,我必须在 ModelAdmin class.

中进行更改
    class StudentAdmin(Admin.ModelAdmin):
        list_display = [..., "created_at_etc", ...]
        def add_view(self, request, form_url='', extra_context=None):
            timezone.activate("US/Eastern")
            return super(ActivityAdmin, self).add_view(
                request,
                form_url,
                extra_context
            )

        def change_view(self, request, object_id, form_url='', extra_context=None):
            timezone.activate("US/Eastern")
            return super(ActivityAdmin, self).change_view(
                request,
                object_id,
                form_url,
                extra_context
          )

        def get_time(self, time):
            import pytz
            fmt = '%Y-%m-%d %H:%M:%S %Z'
            tz = pytz.timezone("US/Eastern")
            dt = time.astimezone(tz)
            return dt.strftime(fmt)

        def created_at_etc(self, student):
            return self.get_time(student.created_at)

        created_at_etc.short_description = "Created At"
    

您可以使用

在 django admin 中激活特定时区
from django.utils import timezone
timezone.activate("US/Eastern")

有了这个,您可以在您想要的上下文中更改时区。正如我在 add_viewchange_view.

中所做的一样

首先,我重写了 add_view 方法,让我们可以在特定时区创建 Student 对象。其次,我覆盖了 change_view 以便我们可以在特定时区编辑已经存在的 Student。第三,我创建了 created_at_etc 它将显示特定时区的日期。

有关详细信息,您可以使用 This Article