作为练习,我试图为24小时制作一个自定义的django小部件。小部件将是一个MultiWidget - 每个字段的选择框。
我试图在线跟踪文档(有点稀疏)并查看Pro Django书,但我似乎无法弄明白。我是在正确的轨道上吗?我可以从表单中保存我的数据,但是当我预先填充表单时,表单没有以前的值。
似乎问题是decompress()方法'value'参数总是为空,所以我没有什么可解释的。
from django.forms import widgets
import datetime
class MilitaryTimeWidget(widgets.MultiWidget):
"""
A widget that displays 24 hours time selection.
"""
def __init__(self, attrs=None):
hours = [ (i, "%02d" %(i)) for i in range(0, 24) ]
minutes = [ (i, "%02d" %(i)) for i in range(0, 60) ]
_widgets = (
widgets.Select(attrs=attrs, choices=hours),
widgets.Select(attrs=attrs, choices=minutes),
)
super(MilitaryTimeWidget, self).__init__(_widgets, attrs)
def decompress(self, value):
print "******** %s" %value
if value:
return [int(value.hour), int(value.minute)]
return [None, None]
def value_from_datadict(self, data, files, name):
hour = data.get("%s_0" %name, None)
minute = data.get("%s_1" %name, None)
if hour and minute:
hour = int(hour)
minute = int(minute)
return datetime.time(hour=hour, minute=minute)
return None
在我的表单中,我将小部件称为:
arrival_time = forms.TimeField(label="Arrival Time", required=False, widget=MilitaryTimeWidget())
答案 0 :(得分:4)
注意this line in the docstring for MultiWidget:
您可能希望将此类与MultiValueField一起使用。
这是你问题的根源。您可能能够使单一小部件的方法工作(Marty说它可能在 Pro Django ,但我从来没有尝试过,而且我认为它可能会更多工作),但是在这种情况下,您的小部件不应该是MultiWidget的子类。
您需要做的是(如果您想要遵循MultiWidget / MultiValueField路径):
然后一切都会正常工作。
答案 1 :(得分:0)
我无法重现这个问题:
>>> class MyForm(forms.Form):
... t = forms.TimeField(widget=MilitaryTimeWidget())
...
>>> print MyForm(data={'t_0': '13', 't_1': '34'})
******** 13:34:00
<tr><th><label for="id_t_0">T:</label></th><td><select name="t_0" id="id_t_0">
<option value="0">00</option>
[...]
<option value="13" selected="selected">13</option>
[...]
<option value="23">23</option>
</select><select name="t_1" id="id_t_1">
<option value="0">00</option>
[...]
<option value="34" selected="selected">34</option>
[...]
<option value="59">59</option>
</select></td></tr>
检查您的request.POST是否正确。
作为旁注,您确定这个小部件具有良好的可用性吗?四次点击鼠标并可能滚动分钟组合框...