我使用django,为了节省时间,我在epoch time
中使用IntegerField
,因此我的模型如下:
class MyModel(models.Model):
start_time = models.IntegerField()
和admin中的start_time如下:
这不是问题,但是很难检查和更新一个人的字段,所以我的问题是,如何在django admin中将该IntegerField
转换为DateTimeField
而不更改模型?我知道我可以将此字段表示为只读字段并将纪元时间转换为DateTime,但是我如何使用django admin DateTime选择器?
答案 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
结果是:
最后一步是将DateTimeField保存到IntegerField作为纪元时间:
def save_model(self, request, obj, form, change):
obj.start_time = round(form.cleaned_data['start_date_time'].timestamp())
obj.save()