我有:date_due = models.DateField(null=True, blank=True)
以及发生上述情况的类的相关模型表单。所有其他值在模型表单中都可以正常验证,但是当我以2017年8月25日格式输入日期时,我收到一条错误消息:"输入有效日期"。在settings.py中,我设置了USE_L10N = True
(并设置了USE_L18N = False
以确保仅观察到USE_L10N设置。)
在日期输入数据时将接受的格式列表 领域。将使用第一个有效格式按顺序尝试格式。注意 这些格式字符串使用Python的datetime模块语法,而不是 格式化日期模板过滤器中的字符串。
并举例说明。使用给出的示例,在我的设置中,我放置了:
DATE_INPUT_FORMATS = [
'%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006'
'%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
'%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
'%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006'
'%d %b %Y', '%d %b, %Y' # '25 Oct 2006', '25 Oct, 2006'
]
然而,在注释中所说的Format Localization documentation (Locale aware input in forms)中:
Django使用不同的格式将数据显示给它用于解析数据的格式。最值得注意的是,解析日期的格式不能使用%a(缩写为工作日名称),%A(完整工作日名称),%b(缩写月份名称),%B(完整月份名称)或%p(AM) / PM)。
文档的这两个部分似乎存在冲突,我倾向于认为后者是正确的,因为它没有遵守我指定的DATE_INPUT_FORMATS。如何在表单中验证日期:2017年8月25日?
进一步尝试: 我将USE_L10N设置为False并将USE_I18N设置为True并允许我的表单接受2017年8月25日格式化的日期,但是,如果我现在尝试使用TIME_INPUT_FORMATS并使用文档中的示例格式(并将USE_L10N设置回True),我的表格不会以格式验证时间:下午5:00。此外,将USE_L10N设置回True然后导致日期和时间不通过表单验证。看起来DATE_INPUT_FORMATS和TIME_INPUT_FORMATS似乎没有按照文档中的说明工作。
进一步尝试: 我从设置中将DATE_INPUT_FORMATS导入表单,然后将其放在 init 中: self.fields [' date_due'] .input_formats =(DATE_INPUT_FORMATS) 由于USE_L10N仍设置为True且USE_I18N为False,现在可以使用以下格式:2017年8月25日使用上面显示的相同DATE_INPUT_FORMATS验证日期。然而,当我随后尝试相同的事情(将TIME_INPUT_FORMATS导入表单)然后执行此操作时:
self.fields['time_due'].input_formats = (TIME_INPUT_FORMATS)
当表单验证时间时,STILL会出错。以下是时间格式:
TIME_INPUT_FORMATS = [
'%-I:%M %p', # '2:30 AM/PM'
'%-I:%M%p' # '2:30AM/PM'
]
重申一下,Django似乎只是忽略了所谓的全局DATE_INPUT_FORMATS和TIME_INPUT_FORMATS设置变量。我不必在 init 中的每个表单上设置这些。