在Django modelform中将字符串转换为datetime

时间:2014-12-25 23:38:30

标签: django datetime django-forms

我想在Django ModelForm生成的表单上接受自然语言字符串到DateTime字段。我找到了Converting string into datetime,它解释了如何将输入字符串转换为DateTime对象。 (在这种情况下,我使用时间字符串进行转换,而不是像答案中建议的strptime,因为我想处理像'明天'那样的输入。)但是我无法弄清楚这些代码应放在哪里ModelForm代码。如果转换代码放在form_valid中,它永远不会运行,因为is_python先运行并抱怨文本输入不是DateTime。当我覆盖is_python时,我得到一个错误,我认为它来自某种递归循环。

相关代码:

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'),但随后是site-packages / django / forms / fields中的validate()函数.py运行并由于某种原因返回到timestring包,并尝试从Date.py运行def __eq__(self, other):,我认为它试图运行Date(其他),由于其他是空白的,因此失败。

在ModelForm中接受文本字符串然后将其转换为特定于字段的字符串(如DateTime)以保存在数据库中的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

尝试重用builtin django日期解析方法:

class NaturalDateField(forms.DateField):

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

答案 1 :(得分: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