#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
его, чтобы отобразить дату относительно конкретного часового пояса.
Для получения дополнительной информации вы можете использовать эту статью.