我在Django 1.8中有一个DateTimeInput字段的问题。
使用以下形式:
def __init__(self, *args, **kwargs):
"""Additional init function for changing field behavior
"""
super(UpdateMaintenanceForm, self).__init__(*args, **kwargs)
self.fields['name'].widget = forms.TextInput(attrs={'class': 'form-control'})
self.fields['description'] = forms.CharField(
required=False, widget=forms.Textarea(attrs={'class': 'form-control'})
)
self.fields['active_since'] = forms.DateTimeField(
input_formats=['%d.%m.%Y %H:%M'], widget=forms.DateTimeInput(attrs={'class': 'form-control'})
)
self.fields['active_till'] = forms.DateTimeField(
input_formats=['%d.%m.%Y %H:%M'], widget=forms.DateTimeInput(attrs={'class': 'form-control'})
)
self.initial['active_since'] = datetime.fromtimestamp(self.initial['active_since']).strftime("%d.%m.%Y %H:%M")
self.initial['active_till'] = datetime.fromtimestamp(self.initial['active_till']).strftime("%d.%m.%Y %H:%M")
我将日期存储为数据库中的unix时间戳。当添加日期时,我得到错误信息"输入有效日期/时间"。进入调试器后,我发现Error是从为IntegerFields定义的to_python方法引发的。这个问题对我来说非常清楚,我不能将datetime对象添加到整数字段。但是我不想将日期作为日期时间存储到数据库中。因此,我需要修改to_python方法以将datetime对象转换为unix时间戳。最好的方法是什么?为我的模型编写一个自定义字段,或者有一种方法使用自己的to_python方法操纵小部件?
通过子类化模型解决了这个问题。Integerfield和添加自己的to_python转换:
类UnixDateTime (models.IntegerField):
def to_python(self, value):
if value is None:
return value
if isinstance(value, int):
return value
if isinstance(value, datetime):
return mktime(value.timetuple())
else:
raise exceptions.ValidationError(
self.error_messages['invalid'], code='invalid', params={'value': value},
)