关于此功能的文档有点缺乏。
from django import forms class TwoInputWidget(forms.MultiWidget): """An example widget which concatenates two text inputs with a space""" def __init__(self, attrs=None): widgets = [forms.TextInput, forms.TextInput]
我可以看到我需要创建一个带有其他小部件列表的“ widgets”属性,但此后会得到一些Sherlock Holmes。
有人可以向我解释如何使用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)
我做了什么
django.forms.widgets.MultiWidget
widgets.WidgetName
我也已经实现了,decompress因为你必须-你应该期望在单个value对象中从数据库传递值。decompress将其分解以显示在小部件中。你在这里的操作方式和操作取决于你,取决于小部件。 我没有但可能已经覆盖的东西:
decompress
render,这实际上是负责渲染小部件的,因此,如果将其子类化,则肯定需要调用super render方法。你可以通过将其子类化来更改在呈现之前事物的显示方式。 例如,django markitup的render方法:
render
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
_get_media
markitup
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班上重要部分。你要尝试执行的操作确实取决于你创建的内容/所使用的小部件,这就是为什么我无法轻松进行详细介绍的原因。