Поля часового пояса Django построены на часовые пояса pytz, но некоторые из часовых поясов последнего недействительны для полей. С такой моделью, как
from django.db import models
from timezone_field import TimeZoneField
class TestModel(models.Model):
timezone_field = TimeZoneField(default='UTC')
def save(self, *args, **kwargs):
self.clean()
self.full_clean()
super().save(*args, **kwargs)
Если я бегу (в оболочке)
import pytz
from models import TestModel
model = TestModel.objects.get(id=1)
for zone in pytz.all_timezones:
model.timezone = zone
model.save()
я получил
django.core.exceptions.ValidationError: {'timezone': ["Value <DstTzInfo 'Africa/Asmera' LMT+2:27:00 STD> is not a valid choice."]}
Таким образом, он сначала терпит неудачу на 'Africa/Asmera' (он терпит неудачу и на других, например, 'GMT+0').
Есть идеи, как устранить это несоответствие? На данный момент пользователь может выбрать часовой пояс на интерфейсе, который выдаст ошибку серверного интерфейса (интерфейс построен в React и получает часовые пояса из часовой пояс момента)
Ага .. Есть идеи, как вставить common_timezones в javascript? (Помимо их печати и сохранения в файл)? Кроме того, если вы напишете это как ответ, я приму
Как теперь получить часовые пояса в JavaScript? В пакете есть поддержка полей формы, и это, насколько мне известно, common_timezones.
Я получаю их из текущего часового пояса: momentjs.com/timezone
ну, в пакете есть функции для поля формы. Таким образом, вы можете использовать прикрепленное поле формы.






Как упоминал Виллем в версии 1.2 Django Timezone Fields, они изменили выбор поля по умолчанию с all_timezones на common_timezones. Вы можете отменить это изменение, явно установив атрибут choices в определении поля.
https://github.com/mfogel/django-timezone-field
1.2 (2015-02-05) For form field, changed default list of accepted timezones from pytz.all_timezones to pytz.common_timezones, to match DB field behavior. 1.1 (2014-10-05) Django 1.7 compatibility Added support for formating choices kwarg as [[, ], ...], in addition to previous format of [[, ], ...]. Changed default list of accepted timezones from pytz.all_timezones to pytz.common_timezones. If you have timezones in your DB that are in pytz.all_timezones but not in pytz.common_timezones, this is a backward-incompatible change. Old behavior can be restored by specifying choices=[(tz, tz) for tz in pytz.all_timezones] in your model definition.
class TestModel(models.Model):
timezone_field = TimeZoneField(default='UTC', choices=[(tz, tz) for tz in pytz.all_timezones])
Есть отказ от ответственности по поводу того, что это обратно несовместимое изменение; поэтому я призываю вас изучить это подробнее
Выбор только
common_timezones, но неall_timezones.