Django时区字段不接受所有pytz时区

时间:2018-05-10 10:24:01

标签: python django timezone pytz django-timezone

Django timezone fields建立在pytz timezones之上,但后者的某些时区对字段无效。使用像

这样的模型
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)

如果我跑(在一个shell中)

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中构建的,并从moment timezone获取时区)

1 个答案:

答案 0 :(得分:2)

正如Willem在Django Timezone Fields的V1.2中提到的,他们将字段的默认选择从all_timezones更改为common_timezones。您可以通过在字段定义中明确设置choices属性来还原此更改。

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

  

1.2(2015-02-05)对于表单字段,将已接受时区的默认列表从pytz.all_timezones更改为pytz.common_timezones,以匹配   DB字段行为。   1.1(2014-10-05)Django 1.7兼容性除了以前的格式之外,还增加了对格式选择的支持kwarg [[,],...]   [[,],...]。更改了已接受的默认列表   时区从pytz.all_timezones到pytz.common_timezones。如果你   数据库中的时区在pytz.all_timezones中但不在   pytz.common_timezones,这是一个向后不兼容的变化。旧   通过为tz in指定choices = [(tz,tz),可以恢复行为   你的模型定义中的pytz.all_timezones]。

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

有一个免责声明,这是一个向后不兼容的变化;所以我建议你进一步研究