Django Forms - 格式选择字段时间值为AM / PM

时间:2015-04-20 15:26:10

标签: python django

我有一个Django表单选择字段,有15分钟的时段选项:

<select id="mytime" name="mytime">
<option value="2:00 PM">2:00 PM</option>
<option value="2:15 PM">2:15 PM</option>
<option value="2:30 PM">2:30 PM</option>
<option value="2:45 PM">2:45 PM</option>
...

我遇到的问题是,当我编辑实例值时,除非我有24小时格式的选项值,例如<option value="14:45:00">14:45:00</option>,否则不会自动选择当前时间值,因为这是匹配的数据库格式

views.py

times = []
for i in range(0, 24*4):
    times.append((datetime.combine(date.today(), time()) + timedelta(minutes=15) * i).time().strftime("%I:%M %p").lstrip('0'))
form = MyForm(instance=instance, 
       options=[( choice, choice ) for choice in times])
return ...

forms.py

self.fields['mytime'] = forms.ChoiceField(
                        required=True,
                        choices=options,
                        widget=forms.Select(
                            attrs={'class': 'myclass',}
                       ))

由于这是Select字段,因此窗口小部件不会接受format属性。

有什么方法吗?

如何在选择当前值的下拉菜单中实现AM / PM格式?


工作代码:

forms.py

def __init__(self, *args, **kwargs):
options = kwargs.pop('options', None)
super(MyForm, self).__init__(*args, **kwargs)

self.fields['mytime'] = forms.ChoiceField(
                        required=True,
                        choices=options,
                        widget=forms.Select(
                            attrs={'class': 'myclass',}
                       ))

view.py

 form = MyForm(request.POST or None, instance=instance,
                   options=[( choice.strftime("%H:%M:%S"), choice.strftime("%I:%M %p").lstrip('0') ) for choice in times])

2 个答案:

答案 0 :(得分:3)

如果我理解正确的话,如果标记看起来像这样,那么一切都会有效。

<option value="14:00:00">2:00 PM</option>

您可以更改 views.py ,以便生成choices元组,其值为24h格式,显示字符串为a.m.和p.m。

times = []
for i in range(0, 24*4):
    times.append((datetime.combine(date.today(), time()) + timedelta(minutes=15) * i).time())
form = MyForm(instance=instance,
       options=[( choice.strftime("%H:%M:%S"), choice.strftime("%I:%M %p").lstrip('0') ) for choice in times])
return ...

答案 1 :(得分:2)

这可以通过传递参数initial

来实现

类似下面的内容应该可以解决问题

if instance:
    mytime_initial = time.strptime(instance.mytime, '%I:%M %p').lstrip('0')
else:
    mytime_initial = None

self.fields['mytime'] = forms.ChoiceField(
    required=True,
    choices=options,
    initial=mytime_initial,
    widget=forms.Select(
        attrs={'class': 'myclass',}
    )
)