在Django admin上覆盖时间字段

时间:2014-02-24 13:52:31

标签: python django date django-admin

我有一个包含一些事件的模型。该事件有一个start_time_unix和一个local_timezone。

我正在使用Django Admin面板允许用户在该事件的local_timezone中设置事件start_time_unix。为此,我重新模拟了模型的save函数,将其转换为UTC并保存在数据库中。

我的问题是,当通过Admin模型表单查看时,如何将其转换为该事件的本地时区?目前它以UTC格式显示。我想我需要覆盖DateTimeField或其他东西,但到目前为止我的尝试还没有成功。

2 个答案:

答案 0 :(得分:1)

您只需启用时区支持并删除自定义的save功能逻辑。

Django's Documentation says

  

当启用对时区的支持时,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(....)

    ....