2015-06-01 5 views
1

У меня проблема с полями DateTimeInput в Django 1.8. используетсяDjango 1.8 DateTimeInput сохранение как UnixTimestamp

Следующая форма:

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 временные метки в базе данных. При добавлении даты я получил сообщение об ошибке «Введите действительную дату/время». Вступая в отладчик, я обнаружил, что ошибка возникает из метода to_python, определенного для IntegerFields. Проблема очень ясна для меня, я не могу добавить объект datetime к целочисленному полю. Но я не хочу хранить даты в datetime в базе данных. Поэтому мне нужно изменить метод to_python для преобразования объекта datetime в временную метку unix. Что было бы лучшим способом сделать это? Напишите настраиваемое поле для моей модели или есть способ манипулирования виджетами с помощью собственного метода to_python?

ответ

0

Решил проблему путем создания подклассов models.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}, 
     ) 
Смежные вопросы