Django的非必需日期时间字段验证不符合预期

时间:2017-06-13 08:29:41

标签: python django forms validation datetime

我有一个带有非常基本模型和表单的小型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'
]

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

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

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

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

2 个答案:

答案 0 :(得分:2)

出于某种原因,在验证和清理数据之后,您忽略了所有这些工作并直接回到原始数据。别这么做。

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

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

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

但实际上Django比这更容易。如果你让你的表单继承自ModelForm,并添加一个带有model = Task的内部Meta类,你只需执行form.save()即可为你创建任务。

答案 1 :(得分:0)

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想要的格式 我相信bootstrap datetimepicker允许pass format as an option。如果需要,以下是supported formats的列表。