Django 表单:时间字段验证

Posted

技术标签:

【中文标题】Django 表单:时间字段验证【英文标题】:Django Forms: TimeField Validation 【发布时间】:2011-02-24 05:11:18 【问题描述】:

我觉得我在这里遗漏了一些明显的东西。我有一个带有TimeField 的 Django 表单。我希望能够允许像“上午 10:30”这样的时间,但我不能让它接受该输入格式或使用“%P”格式(它有一个 note attached 说它是一个“专有扩展”,但是没有说它来自哪里)。这是我的表单代码的要点:

calendar_widget = forms.widgets.DateInput(attrs='class': 'date-pick', format='%m/%d/%Y')
time_widget = forms.widgets.TimeInput(attrs='class': 'time-pick')
valid_time_formats = ['%P', '%H:%M%A', '%H:%M %A', '%H:%M%a', '%H:%M %a']

class EventForm(forms.ModelForm):
    start_date = forms.DateField(widget=calendar_widget)
    start_time = forms.TimeField(required=False, widget=time_widget, help_text='ex: 10:30AM', input_formats=valid_time_formats)
    end_date = forms.DateField(required=False, widget=calendar_widget)
    end_time = forms.TimeField(required=False, widget=time_widget, help_text='ex: 10:30AM', input_formats=valid_time_formats)
    description = forms.CharField(widget=forms.Textarea)

每当我提交“上午 10:30”时,我都会收到验证错误。底层模型有两个字段,event_start 和 event_end,没有时间字段,所以我认为问题不在那里。我错过了什么愚蠢的事情?

【问题讨论】:

你不能像那样使用%P,我很确定那只是用于输出,不能用于解析(即作为输入掩码)。你到底得到了什么ValidationError 【参考方案1】:

感谢凯伦的回答:格式化字符不是为Django's now/ date filters 列出的字符,而是Python's time.strftime(format[, t]) 的字符。要接受 AM/PM,您需要从 %H 切换到 %I,因此过滤器现在看起来像:

valid_time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']

(这个信息是开源代码带给你的。没有它,我永远也想不通。)

【讨论】:

谢谢,对于 Django 1.5 使用 TIME_INPUT_FORMATS = ['%H:%M', '%I:%M%p', '%I:%M %p'] 另请注意 %p 不允许 A.M.或下午【参考方案2】:

您需要在指定 %p 时使用 %I 来解析小时。请参阅此处指令表下的第一个注释:http://docs.python.org/library/time.html#time.strftime。

【讨论】:

以上是关于Django 表单:时间字段验证的主要内容,如果未能解决你的问题,请参考以下文章

将经过身份验证的用户作为字段的 Django 表单验证

Django - 禁用表单选择字段验证

django 表单验证和字段验证

如果空值传递给Django中的表单字段,如何验证表单?

Django 表单字段验证 - 如何判断操作是插入还是更新?

根据另一个字段的值验证 Django 模型字段?