Как изменить часовой пояс в конкретной модели администратора Django?

#python #django #timezone

#python #django #Часовой пояс

Вопрос:

Я хочу изменить часовой пояс только в пределах одной конкретной модели в Django admin, как я могу это сделать?

Поскольку Django экономит время в базе данных в UTC, я хочу отобразить значение в определенном часовом поясе только для одной модели. Не для всего проекта.

Например, у меня есть модель:

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

Когда я открываю Django Admin для этой модели, я хочу увидеть время в определенном часовом поясе (скажем, ETC), но пусть Django экономит время в UTC.

Комментарии:

1. Что вы подразумеваете под «изменением часового пояса»? Изменить форматирование объектов datetime?

2. Я не понимаю вашего вопроса… Вы хотите изменить часовой пояс полей даты конкретной модели? не было бы проще просто компенсировать их при их использовании?

3. База данных сохраняет время в UTC, но я хочу отображать время в администраторе Django в определенном часовом поясе.

4. Я нашел это djangopackages.org/packages/p/django-timezone-field

5. Вы можете указать часовой пояс в своем шаблоне, используя docs.djangoproject.com/en/3.1/topics/i18n/timezones/#timezone

Ответ №1:

итак, я нашел решение: чтобы выполнить то, что я хотел выполнить, мне пришлось внести изменения в ModelAdmin класс.

     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_view , change_view .

Сначала я переопределил add_view метод, который позволит нам создать Student объект в конкретном часовом поясе. Во-вторых, я переопределил change_view , чтобы мы могли редактировать уже существующие Student в конкретном часовом поясе. В-третьих, я создал created_at_etc его, чтобы отобразить дату относительно конкретного часового пояса.

Для получения дополнительной информации вы можете использовать эту статью.