如何使Django DateTimefield不需要?

时间:2013-10-06 11:58:03

标签: python django

我知道,有一个类似的问题,(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字段可选。

1 个答案:

答案 0 :(得分:5)

这是因为您在start_date中将CharField声明为DataForm,而应使用forms.DateTimeField

您的字段不是必填字段,因此允许用户将其留空。 当你以一种形式发布数据时,这就是Django内部发生的事情:

  1. 表单字段尝试将原始数据转换为Python类型。
  2. 为此,首先检查是否可以在empty_values数组中找到原始数据(被视为“空”的值列表,硬编码到字段的源代码中)。
  3. 如果它在empty_values中找到了值(在您的情况下就是这种情况),它将返回空值的正确Python表示形式。除非需要该字段,否则会引发ValidationError
  4. 如果该值不为空,则继续将其转换为Python的类型。
  5. 然后将返回值插入您的模型或您的表单中。
  6. 在第3点。forms.CharFieldforms.DateTimeField表现不同。 CharField找到空值并返回'',一个空字符串,而DateTimeField则返回Nonemodel.DateTimeField的正确空白值为None而不是''

    这就是Django引发异常的原因:因为你试图将''分配给models.DateTimeField,而后者无法将其正确地转换为日期,因为它无法识别'' 1}}作为DateTimeField的有效空白值。

    您可以看到Django's source code更好地了解其工作原理,还可以看documentation撰写自定义字段和form and field validation