2

我知道,有一个类似的问题,(我已阅读),但我对该问题有疑问。

我的 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 字段可选。

4

1 回答 1

6

发生这种情况是因为您在您的, 中声明start_date为 a ,您应该使用.CharFieldDataFormforms.DateTimeField

您的字段不是必需的,因此允许用户将其留空。当您在表单中发布数据时,这就是 Django 内部发生的情况:

  1. 表单字段尝试将原始数据转换为 Python 类型。
  2. 为此,首先检查是否可以在empty_values数组中找到原始数据(被视为“空”的值列表,硬编码到字段的源代码中)。
  3. 如果它在其中找到值empty_values(您的情况就是这种情况),它将返回空值的正确 Python 表示。除非该字段是必需的,否则在这种情况下会引发ValidationError.
  4. 如果该值不为空,则继续转换为 Python 的类型。
  5. 然后将返回值插入您的模型,或者您的表单所做的任何事情。

在第 3 点forms.CharFieldforms.DateTimeField表现不同。CharField找到空值并返回'',一个空字符串,而DateTimeField返回None。的正确空白值model.DateTimeFieldis Nonenot ''

这就是 Django 引发异常的原因:因为您正在尝试分配''to models.DateTimeField,而后者无法正确地将其转换为日期,因为它不能识别''为 a 的有效空白值DateTimeField

您可以查看Django 的源代码以更好地了解它的工作原理,以及有关编写自定义字段和表单和字段验证的文档

于 2013-10-06T12:05:23.507 回答