You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django表单设置时间默认值后输入时间出现‘请选择有效值’错误

Django TimeField表单验证错误排查

我创建了如下Django表单:

class SearchTimeSlotsForm(forms.Form):
    available_from = forms.TimeField(widget=TimeInput(attrs={'class': 'unbold-form'}), initial=time(0))
    available_till = forms.TimeField(widget=TimeInput(attrs={'class': 'unbold-form'}), initial=time(23,59,59))

如你所见,我为表单设置了默认值,但输入时间时却收到错误提示「Please select a valid value」(请选择有效值)。

错误提示截图:
错误提示截图

需要说明的是,用户可输入任意时间,该问题与默认值或格式无关,本不应出现此错误。有人能告诉我错误原因吗?

相关代码见GitHub仓库:room_slot_booking项目的hotel/forms.py文件


错误原因及解决方法

核心问题是浏览器提交的时间格式与Django TimeField默认验证格式不匹配:

  • Django的TimeField默认仅支持HH:MM或HH:MM:SS的24小时制格式;
  • 若浏览器采用12小时制输入(带AM/PM标识)或其他非标准格式,Django会直接判定为无效值。

具体解决步骤:

  1. 显式指定兼容的输入格式,覆盖TimeField默认验证规则,同时支持24小时制和12小时制:
from django import forms
from django.utils.timezone import time

class SearchTimeSlotsForm(forms.Form):
    available_from = forms.TimeField(
        widget=forms.TimeInput(attrs={'class': 'unbold-form'}),
        initial=time(0),
        # 支持多种时间格式:24小时制(带/不带秒)、12小时制(带/不带秒+AM/PM)
        input_formats=['%H:%M', '%H:%M:%S', '%I:%M %p', '%I:%M:%S %p']
    )
    available_till = forms.TimeField(
        widget=forms.TimeInput(attrs={'class': 'unbold-form'}),
        initial=time(23,59,59),
        input_formats=['%H:%M', '%H:%M:%S', '%I:%M %p', '%I:%M:%S %p']
    )
  1. 排查前端提交的实际数据:在视图函数中打印request.POST,查看提交的时间值具体格式,再针对性调整input_formats中的规则。
  2. 若使用了第三方时间输入插件,确认插件输出的时间格式与Django验证规则匹配。

内容的提问来源于stack exchange,提问作者Anshul Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:25:23