我知道,有一个类似的问题(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 字段可选。
最佳答案
发生这种情况是因为您在 DataForm
中将 start_date
声明为 CharField
,您应该改用 forms.DateTimeField
.
您的字段不是必需的,因此允许用户将其留空。 当您以表单形式发布数据时,这就是 Django 内部发生的情况:
- 表单字段尝试将原始数据转换为 Python 类型。
- 为此,首先检查是否可以在
empty_values
数组(被视为“空”的值列表,硬编码到字段的源代码中)中找到原始数据。 - 如果它在
empty_values
中找到值(您的情况就是这种情况),它会返回空值的正确 Python 表示形式。除非该字段是必需的,否则会引发ValidationError
。 - 如果该值不为空,则继续转换为 Python 的类型。
- 然后将返回值插入到您的模型或您的表单中。
在第 3 点。forms.CharField
和 forms.DateTimeField
的行为不同。 CharField
找到空值并返回 ''
,一个空字符串,而 DateTimeField
返回 None
。 model.DateTimeField
的正确空白值为 None
而不是 ''
。
这就是 Django 引发异常的原因:因为您试图将 ''
分配给 models.DateTimeField
,而后者无法将其正确转换为日期,因为它无法将 ''
识别为 DateTimeField
的有效空白值。
可以看到Django's source code更好地了解它的工作原理,以及 documentation关于编写自定义字段和 form and field validation .
关于python - 如何使 Django DateTimefield 成为非必需的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19208614/