Поля часового пояса Django не принимают все часовые пояса pytz

Поля часовых поясов 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 и получает часовые пояса из часовой пояс момента)


person jorgen    schedule 10.05.2018    source источник
comment
Варианты только common_timezones, а не all_timezones.   -  person Willem Van Onsem    schedule 10.05.2018
comment
Ага.. Любая идея, как получить common_timezones в javascript? (кроме их распечатки и сохранения в файл что ли)? Кроме того, если вы напишете это как ответ, я приму   -  person jorgen    schedule 10.05.2018
comment
Как теперь получить часовые пояса в JavaScript? В пакете есть поддержка полей формы, и это, насколько я знаю, тоже common_timezones.   -  person Willem Van Onsem    schedule 10.05.2018
comment
Я получаю их из часового пояса момента: momentjs.com/timezone   -  person jorgen    schedule 10.05.2018
comment
хорошо, у пакета есть функциональность для поля формы. Таким образом, вы можете использовать прикрепленное поле формы.   -  person Willem Van Onsem    schedule 10.05.2018


Ответы (1)


Как упоминал Виллем в V1.2 Django Timezone Fields, они изменили выбор поля по умолчанию с all_timezones на common_timezones. Вы можете отменить это изменение, явно установив атрибут choices в определении поля.

https://github.com/mfogel/django-timezone-field

1.2 (2015-02-05) Для поля формы изменен список допустимых часовых поясов по умолчанию с pytz.all_timezones на pytz.common_timezones, чтобы соответствовать поведению поля БД. 1.1 (2014-10-05) Совместимость с Django 1.7 Добавлена ​​поддержка форматирования выбора kwarg как [[, ], ...], в дополнение к предыдущему формату [[, ], ...]. Изменен список допустимых часовых поясов по умолчанию с pytz.all_timezones на pytz.common_timezones. Если у вас есть часовые пояса в вашей БД, которые находятся в pytz.all_timezones, но не в pytz.common_timezones, это обратно несовместимое изменение. Старое поведение можно восстановить, указав варианты = [(tz, tz) для tz в pytz.all_timezones] в определении вашей модели.

class TestModel(models.Model):
    timezone_field = TimeZoneField(default='UTC', choices=[(tz, tz) for tz in pytz.all_timezones])

Это изменение несовместимо с предыдущими версиями. поэтому я призываю вас изучить это подробнее

person rtindru    schedule 10.05.2018