我有一个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])
答案 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',}
)
)