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

Выбор только common_timezones, но не all_timezones.

Willem Van Onsem 10.05.2018 12:26

Ага .. Есть идеи, как вставить common_timezones в javascript? (Помимо их печати и сохранения в файл)? Кроме того, если вы напишете это как ответ, я приму

jorgen 10.05.2018 12:35

Как теперь получить часовые пояса в JavaScript? В пакете есть поддержка полей формы, и это, насколько мне известно, common_timezones.

Willem Van Onsem 10.05.2018 12:35

Я получаю их из текущего часового пояса: momentjs.com/timezone

jorgen 10.05.2018 12:37

ну, в пакете есть функции для поля формы. Таким образом, вы можете использовать прикрепленное поле формы.

Willem Van Onsem 10.05.2018 12:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
1 373
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упоминал Виллем в версии 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])

Есть отказ от ответственности по поводу того, что это обратно несовместимое изменение; поэтому я призываю вас изучить это подробнее

Другие вопросы по теме