2014-12-25 2 views
0

Я хотел бы принять строки естественного языка в поле DateTime в форме, сгенерированной Django ModelForm. Я нашел Converting string into datetime, в котором объясняется, как преобразовать входную строку в объект DateTime. (В этом случае я использую timestring для преобразования вместо strptime, как это предложено в ответах, потому что я хочу обрабатывать ввод как «завтра».) Но я не могу понять, где этот код должен быть помещен внутри код ModelForm. Если код преобразования размещен в form_valid, он никогда не запускается, потому что is_python работает первым и жалуется, что ввод текста не является DateTime. Когда я переопределяю is_python, я получаю сообщение об ошибке, которое, я думаю, происходит из какого-то рекурсивного цикла.Преобразование строки в datetime в модель модели Django

Соответствующий код:

models.py

class Widget(models.Model): 

    name = models.CharField(max_length=100) 
    widget_date = models.DateTimeField 

forms.py

from timestring import Date 

class NaturalDateField(forms.DateField): 

    def to_python(self, value): 
     if not value: 
      return none 
     return Date(value, tz=timezone.get_current_timezone()) 

class WidgetForm(forms.ModelForm): 

    widget_date = NaturalDateField() 

    class Meta: 
     model = Widget 
     fields = ['name', 'widget_date'] 

views.py

class WidgetUpdate(UpdateView): 
    model = Widget 
    form_class = WidgetForm 

Ошибка при отправке - Invlid date string >>. Трассировка кода показывает, что исходная строка ввода преобразуется правильно (например, «2014-12-26 00: 00: 00-08: 00»), но затем функция validate() из пакетов site-packages/django/forms/fields .py запускается, и по какой-то причине возвращается в пакет timestring и пытается запустить def __eq__(self, other): из Date.py, который, как я думаю, пытается запустить Date (другое), который терпит неудачу, поскольку другой пуст.

Каков наилучший способ принять текстовую строку в ModelForm, а затем преобразовать ее в полевую строку, такую ​​как DateTime, которая будет сохранена в базе данных?

+0

Что такое 'date' в вашем' методе to_python'? –

+0

Дата - класс разбора на естественном языке из Timestring. Добавлен импорт для показа. –

ответ

0

Глядя на этот проект, ваш код будет возвращать timestring.Date объект, который Django не знает, что делать с. Вы, наверное, просто нужно, чтобы получить значение date оттуда:

def to_python(self, value): 
    if not value: 
     return none 
    parsed_date = Date(value, tz=timezone.get_current_timezone()) 
    return parsed_date.date 
+0

Это сработало - тоже, мне пришлось добавить в обработке исключений, так что форма проверки будет работать: попробовать: parsed_date = Дата (значение, TZ = timezone.get_current_timezone()) кроме: поднять ValidationError ("Не удалось понимать:% s "% value) return parsed_date.date –

0

Try повторное использование builtin Джанго методы Дата синтаксического анализа:

class NaturalDateField(forms.DateField): 

    def to_python(self, value): 
     value = super(NaturalDateField, self).to_python(value) 
     return value.replace(tzinfo=timezone.get_current_timezone())