Django接受AM/PM作为表单输入

3

我正在尝试使用DateTime字段在Django中接受am/pm作为时间格式,但是我遇到了一些问题。我已经尝试在我的forms.py文件中像这样进行设置:

pickup_date_time_from = DateTimeField(input_formats=["%m/%d/%Y %I:%M %p"])

使用以下数据:
12/31/2017 02:40 pm

然而,当我提交表单时,出现了验证错误:
(Hidden field pickup_date_time_from) Enter a valid date/time.

我也尝试按照文档所说,在settings.py中设置一个全局变量:

DATETIME_INPUT_FORMATS = ['%m/%d/%y %I:%M %p']

如果我提交的数据没有am/pm,那么它是有效的,但输出结果是什么呢?
2017-12-31 02:40:00+00:00

还有其他选项吗?


你的项目是否开启了本地化?在你的设置文件中,应该是 USE_L10N = True。如果没有开启,开启它能解决你的问题吗? - rubayeet
是的,本地化已设置为True。 - Alfredo
你不能使用内置解析器来完成这个任务 - 请参考此处的说明 - solarissmoke
@solarissmoke 我更新了我的代码为:pickup_date_time_from = DateTimeField(input_formats=["%m/%d/%Y %I:%M %p"],localize=True),但是我仍然收到无效的日期/时间错误。 - Alfredo
我不明白你的意思。根据我上面提供的注释,Django 无法解析包含“%p”的日期时间。 - solarissmoke
1个回答

1

DATETIME_INPUT_FORMATS无法处理包含%p的格式。 kwarg也不行。

作为一个快速解决方法,您可以在Form__init__方法中更改DateTimeFieldinput_formats属性。 例如:

class DateTimeForm(forms.Form):
    CUSTOM_FORMAT = '%m/%d/%y %I:%M %p'

    date_input = forms.DateTimeField(widget=forms.HiddenInput)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if self.CUSTOM_FORMAT not in self.fields['date_input'].input_formats:
            self.fields['date_input'].input_formats.append(self.CUSTOM_FORMAT)

Django文档确实说在解析日期字段时不能使用%p。

但是,如果您查看源代码,DateTimeField的to_python方法并没有强制执行任何类似的规定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接