我知道,有一个类似的问题,(I have read),但我对这个问题有疑问。
我的forms.py如何:
class DataForm(forms.ModelForm):
start_date = forms.CharField(
widget=widgets.DateTimePicker(attrs={'class': 'form-control', 'style': 'width:90%'}),
required=False
)
....
class Meta:
model = Data
我的models.py就是这样:
start_date = models.DateTimeField(null=True, blank=True)
当我试图以这种方式保存时:
if form.is_valid():
form.save()
我收到了这个错误:
[u"'' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."]
这有什么问题?我想让start_date字段可选。
答案 0 :(得分:5)
这是因为您在start_date
中将CharField
声明为DataForm
,而应使用forms.DateTimeField
。
您的字段不是必填字段,因此允许用户将其留空。 当你以一种形式发布数据时,这就是Django内部发生的事情:
empty_values
数组中找到原始数据(被视为“空”的值列表,硬编码到字段的源代码中)。empty_values
中找到了值(在您的情况下就是这种情况),它将返回空值的正确Python表示形式。除非需要该字段,否则会引发ValidationError
。在第3点。forms.CharField
和forms.DateTimeField
表现不同。 CharField
找到空值并返回''
,一个空字符串,而DateTimeField
则返回None
。 model.DateTimeField
的正确空白值为None
而不是''
。
这就是Django引发异常的原因:因为你试图将''
分配给models.DateTimeField
,而后者无法将其正确地转换为日期,因为它无法识别''
1}}作为DateTimeField
的有效空白值。
您可以看到Django's source code更好地了解其工作原理,还可以看documentation撰写自定义字段和form and field validation。