如何在Django管理中将纪元时间整数字段转换为日期时间字段

时间:2019-05-27 05:33:26

标签: python django django-admin

我使用django,为了节省时间,我在epoch time中使用IntegerField,因此我的模型如下:

class MyModel(models.Model):
    start_time = models.IntegerField()

和admin中的start_time如下:

start_time integerfield

这不是问题,但是很难检查和更新一个人的字段,所以我的问题是,如何在django admin中将该IntegerField转换为DateTimeField而不更改模型?我知道我可以将此字段表示为只读字段并将纪元时间转换为DateTime,但是我如何使用django admin DateTime选择器?

1 个答案:

答案 0 :(得分:1)

我发现我的答案希望对其他人有帮助,这是可行的,但也许不是最佳答案。

我使用了中间字段,因为我无法更改实际字段,所以我创建了一个具有DateTimeField的表单:

from django import forms
from django.contrib.admin.widgets import AdminSplitDateTime


class MyModelAdminForm(forms.ModelForm):
    start_date_time = forms.SplitDateTimeField(widget=AdminSplitDateTime())

    class Meta:
        model = MyModel
        fields = '__all__'

然后将表单添加到管理员中

@admin.register(Product)
class MyModelAdmin(admin.ModelAdmin):
    form = MyModelAdminForm
    fields = ('start_date_time',)

用于以格式设置先前保存的对象的初始值:

def get_form(self, request, obj=None, **kwargs):
    form = super().get_form(request, obj, **kwargs)
    if obj:
        form.base_fields['start_date_time'].initial = datetime.datetime.fromtimestamp(obj.start_time)
    return form

结果是:

epoch datetime field

最后一步是将DateTimeField保存到IntegerField作为纪元时间:

def save_model(self, request, obj, form, change):
    obj.start_time = round(form.cleaned_data['start_date_time'].timestamp())
    obj.save()