有趣的问题,我想也许应该在文档中多关注一点。
下面是一个来自
a question I've just asked
:
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)
我做了什么?
-
django.forms.widgets.MultiWidget
-
实现了一个创建多个
widgets.WidgetName
控件中的小部件
元组。这一点很重要,因为超类使用这个元组的存在来为您处理一些事情。
-
我的格式输出是pass-through,但是我的想法是,如果您愿意,可以在这里添加自定义html
-
我还实施了
decompress
value
对象。
将其分解以在小部件中显示。如何和你在这里做什么取决于你和小部件。
我没有,但可以,压倒一切的事情:
例如,django
markitup
的渲染方法:
def render(self, name, value, attrs=None):
html = super(MarkItUpWidget, self).render(name, value, attrs)
if self.auto_preview:
auto_preview = "$('a[title=\"Preview\"]').trigger('mouseup');"
else: auto_preview = ''
html += ('<script type="text/javascript">'
'(function($) { '
'$(document).ready(function() {'
' $("#%(id)s").markItUp(mySettings);'
' %(auto_preview)s '
'});'
'})(jQuery);'
'</script>' % {'id': attrs['id'],
'auto_preview': auto_preview })
return mark_safe(html)
-
value_from_datadict
-看到我的问题了吗
here
-
_get_media
如果您想使用django的媒体表示来检索媒体,可能会很有用。默认实现循环请求媒体的小部件;如果你对它进行子类化,并且正在使用任何花哨的小部件,你需要调用super;如果你的小部件需要任何媒体,那么你需要用这个来添加它。
例如,
马基图普
的django小部件执行以下操作:
def _media(self):
return forms.Media(
css= {'screen': (posixpath.join(self.miu_skin, 'style.css'),
posixpath.join(self.miu_set, 'style.css'))},
js=(settings.JQUERY_URL,
absolute_url('markitup/jquery.markitup.js'),
posixpath.join(self.miu_set, 'set.js')))
media = property(_media)
同样,它正在创建一个指向正确位置的路径元组,就像我的小部件在
__init__
方法。
我认为这涵盖了世界上重要的部分
MultiWidget
the source
.