我有一个包含一些事件的模型。该事件有一个start_time_unix和一个local_timezone。
我正在使用Django Admin面板允许用户在该事件的local_timezone中设置事件start_time_unix。为此,我重新模拟了模型的save
函数,将其转换为UTC并保存在数据库中。
我的问题是,当通过Admin模型表单查看时,如何将其转换为该事件的本地时区?目前它以UTC格式显示。我想我需要覆盖DateTimeField或其他东西,但到目前为止我的尝试还没有成功。
答案 0 :(得分:1)
您只需启用时区支持并删除自定义的save
功能逻辑。
当启用对时区的支持时,Django将日期和时间信息以UTC格式存储在数据库中,在内部使用时区感知日期时间对象,并将它们转换为模板和表单中最终用户的时区。
在同一文档页面中,我们可以看到如何启用时区支持:
默认情况下禁用时区支持。要启用它,请在设置文件中设置
USE_TZ = True
。强烈建议安装pytz,但不是强制性的。它很简单:$ sudo pip install pytz
答案 1 :(得分:0)
在表单的代码中,您需要更改__init__
函数中时间字段的初始显示值:
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
current_initial = self.fields['date_time'].initial
self.fields['date_time'].initial = _to_local_time_zone(current_initial)
def _to_local_time_zone(date_time):
"""Changes a datetime object's timezone."""
pass
date_time = forms.DateTimeField(....)
....
另一种策略是在data
关键字参数中更改它,然后再将其传递到forms.ModelForm.__init__
:
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
if args:
data, args = args[0], args[1:]
else:
data = kwargs.pop('data', None)
if data and 'date_time' in data:
# Make a copy because QueryDict objects are immutable.
data = data.copy()
utc_date_time = data['date_time']
data['date_time'] = self._to_local_time_zone(utc_date_time)
super(MyForm, self).__init__(data, *args, **kwargs)
def _to_local_time_zone(date_time):
"""Changes a datetime object's timezone."""
pass
date_time = forms.DateTimeField(....)
....