16 python django django-widget django-multiwidget
所以我的django书又回到了大学,我正在努力解决这个问题.
我的子类django.forms.widgets.MultiWidget
是这样的:
class DateSelectorWidget(widgets.MultiWidget):
def __init__(self, attrs=None, dt=None, mode=0):
if dt is not None:
self.datepos = dt
else:
self.datepos = date.today()
# bits of python to create days, months, years
# example below, the rest snipped for neatness.
years = [(year, year) for year in year_digits]
_widgets = (
widgets.Select(attrs=attrs, choices=days),
widgets.Select(attrs=attrs, choices=months),
widgets.Select(attrs=attrs, choices=years),
)
super(DateSelectorWidget, self).__init__(_widgets, attrs)
def decompress(self, value):
if value:
return [value.day, value.month, value.year]
return [None, None, None]
def format_output(self, rendered_widgets):
return u''.join(rendered_widgets)
Run Code Online (Sandbox Code Playgroud)
这给了我一个漂亮的日期选择字段,如下所示:
我的问题非常简单.当我将表单提交给它的处理方法时(使用这样的过程:
forminstance = ModelNameForm(request.POST, instance=modelinstance)
if forminstance.is_valid():
forminstance.save()
Run Code Online (Sandbox Code Playgroud)
这失败了,因为Django不知道如何使用我的多小部件并将其转换回基础字段类型(明确地设置models.py
为DateField()
).
现在,关于django源中MultiWidget的注释给了我这个有用的提示:
您可能希望将此类与MultiValueField一起使用.
但问题是 - 我可能不会.我想保留我,DateField()
因为它非常有用,没有必要重复它.我需要做的是以某种方式将这些多个字段转换回单个有效的datestring(yyyy-mm-dd
)以插入数据库.
我的问题是:
怎么样?实现这一目标的最佳方法是什么?
小智 12
回答了我自己的问题!
我实现了这个方法:
def value_from_datadict(self, data, files, name):
datelist = [widget.value_from_datadict(data, files, name + '_%s' % i) \
for i, widget in enumerate(self.widgets)]
try:
D = date(day=int(datelist[0]), month=int(datelist[1]), \
year=int(datelist[2]))
return str(D)
except ValueError:
return ""
Run Code Online (Sandbox Code Playgroud)
value_from_datadict
从整个post datadict中提取所有子窗口小部件的数据.我所做的是提取各种日期对应项,并使用日期构造函数来验证日期.如果它是有效的,我们以正确的格式打印出字符串,否则,我们返回一个空字符串
forminstance.is_valid()
Run Code Online (Sandbox Code Playgroud)
会抓住.
我喜欢它,当我这样做!
归档时间: |
|
查看次数: |
2934 次 |
最近记录: |