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获取时区)
答案 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])
有一个免责声明,这是一个向后不兼容的变化;所以我建议你进一步研究