python - 如何使 Django DateTimefield 成为非必需的?

标签 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 字段可选。

最佳答案

发生这种情况是因为您在 DataForm 中将 start_date 声明为 CharField,您应该改用 forms.DateTimeField.

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

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

在第 3 点。forms.CharFieldforms.DateTimeField 的行为不同。 CharField 找到空值并返回 '',一个空字符串,而 DateTimeField 返回 Nonemodel.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/

相关文章:

python - 将同一对象两次添加到 ManyToManyField

python - Easy_install virtualenv/Pip install virtualenv - 不起作用

java - Python 与 Java -xms 和 -xmx

python - Raspbian 上的 MySQL+Python 产生语法错误

python - 如何将多项式变换应用于 scikit 学习中的特征子集

python - 添加列表中每个子列表的所有第二项

python - 在 Django 中运行 Managepy Shell 时的设置问题

django - Django如何查询树结构

python - 如何在 Python 中使用 ctypes 加载 DLL?

python - 使用 django 模板将 json 填充为 html