Отображение метки времени с часовым поясом в Django admin - PullRequest
0 голосов
/ 21 января 2020

У меня есть модель с учетом часового пояса DateTimeField. Каждый объект может использовать другой часовой пояс. Я бы хотел, чтобы Django Admin отображал это поле с суффиксом часового пояса (EST, et c.), А не по местному времени пользователя или сервера.

Я не хочу глобально изменить настройки локализации часового пояса моего проекта. Это должно относиться только к этому одному полю.

Этот вопрос затрагивает нечто подобное, но я скептически отношусь к решению; при инициализации класса объекта он активирует новый часовой пояс, который не позволяет изменять часовой пояс для каждой строки и влияет на другие временные метки, которые не относятся к конкретному полю, в котором я заинтересован.

1 Ответ

0 голосов
/ 21 января 2020

Одним из способов было бы заменить поле 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 отображает временные метки.)

Однако кажется, что даты сохраняются как UT C и информация о часовом поясе потерян. Мне пришлось хранить часовой пояс отдельно, и использовать obj.timestamp.astimezone(pytz.timezone(obj.timestamp_tz))

...