我想在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)以保存在数据库中的最佳方法是什么?
答案 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