【问题标题】:Django's non-required datetime field validation doesn't act as intendedDjango 的非必需日期时间字段验证未按预期运行
【发布时间】:2017-06-13 08:29:41
【问题描述】:

我有一个带有非常基本模型和表单的小型 Django 应用程序,其中给我带来问题的元素是 DateTimeField

型号:

class Task(models.Model):
    what = models.CharField(max_length=255)
    due = models.DateTimeField(null=True, blank=True)
    #[...]

表格:

class TaskForm(forms.Form):
    due = forms.DateTimeField(required=False)

在视图中,在POST:

form = TaskForm(request.POST)

if form.is_valid():
     # further processing
     # create new task or edit existing task, for example:
     new_task = Task('what':request.POST['what'],
                     'due':request.POST['due'])
     new_task.save()

在模板中,为了显示DateTimeField,我使用bootstrap datetimepicker,效果很好。

问题是我似乎无法为 Django 选择正确的格式。形成我读过的任何以下格式都应该没问题。

[
    '%Y-%m-%d %H:%M:%S',     # '2006-10-25 14:30:59'
    '%Y-%m-%d %H:%M:%S.%f',  # '2006-10-25 14:30:59.000200'
    '%Y-%m-%d %H:%M',        # '2006-10-25 14:30'
    '%Y-%m-%d',              # '2006-10-25'
    '%m/%d/%Y %H:%M:%S',     # '10/25/2006 14:30:59'
    '%m/%d/%Y %H:%M:%S.%f',  # '10/25/2006 14:30:59.000200'
    '%m/%d/%Y %H:%M',        # '10/25/2006 14:30'
    '%m/%d/%Y',              # '10/25/2006'
    '%m/%d/%y %H:%M:%S',     # '10/25/06 14:30:59'
    '%m/%d/%y %H:%M:%S.%f',  # '10/25/06 14:30:59.000200'
    '%m/%d/%y %H:%M',        # '10/25/06 14:30'
    '%m/%d/%y',              # '10/25/06'
]

但是当我使用 DateTimePicker 选择 DateTime 时,它​​不被接受。

我收到了来自 Django 的ValidationError。据我所知,它不是来自.is_valid(),而是来自.save() 函数。

['„“ value has an invalid format and must be of the form YYYY-MM-DD HH: MM [: ss [.uuuuuuu]] [TZ]']

我找不到罪魁祸首,因为它似乎是""。如何缩小问题范围?

【问题讨论】:

    标签: python django forms validation datetime


    【解决方案1】:

    出于某种原因,在验证和清理数据后,您忽略了所有这些工作,直接返回原始数据。不要那样做。

    首先,您应该始终在表单的cleaned_data dict 验证后访问数据。这将包含已正确转换为正确数据类型的数据,在本例中为日期时间。

     new_task = Task('what': form.cleaned_data['what'],
                     'due': form.cleaned_data['due'])
    

    (您应该确保您的 TaskForm 也包含 what 字段。)

    但事实上 Django 比这更容易。如果你让你的表单继承自 ModelForm,并添加一个带有 model = Task 的内部 Meta 类,你可以简单地做 form.save(),它会为你创建任务。

    【讨论】:

    • 非常感谢您的反馈。我不知道cleaned_data 属性,但这实际上是有道理的。
    • 根据您的建议一切正常,谢谢!
    【解决方案2】:

    除了Daniel Roseman's answer,您还可以将格式传递给 DateTime 小部件,以便它可以正确解析它

    due = forms.DateTimeField(required=False, 
                widget=forms.DateTimeField(format='%Y-%m-%d %H:%M:%S', input_formats=['%Y-%m-%d %H:%M:%S'])
    #  use whichever formats you want.
    #  format is the format needed by the frontend, 
    #  & input_formats is a list of possible input formats that need to be parsed
    

    或者,您可以从前端返回 django 所需的格式 我相信引导日期时间选择器允许pass format as an option。如果需要,这里是supported formats 的列表。

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 2018-02-24
      • 1970-01-01
      • 2017-03-07
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      相关资源
      最近更新 更多