5. Browser support¶
The z3c.form
library provides a form framework and widgets. This document
ensures that we implement a widget for each field defined in
zope.schema
. Take a look at the different widget doctest files for more
information about the widgets.
>>> import zope.schema
>>> from z3c.form import browser
Let’s setup all required adapters using zcml. This makes sure we test the real configuration.
>>> from zope.configuration import xmlconfig
>>> import zope.component
>>> import zope.security
>>> import zope.i18n
>>> import zope.browserresource
>>> import z3c.form
>>> xmlconfig.XMLConfig('meta.zcml', zope.component)()
>>> xmlconfig.XMLConfig('meta.zcml', zope.security)()
>>> xmlconfig.XMLConfig('meta.zcml', zope.i18n)()
>>> xmlconfig.XMLConfig('meta.zcml', zope.browserresource)()
>>> xmlconfig.XMLConfig('meta.zcml', z3c.form)()
>>> xmlconfig.XMLConfig('configure.zcml', z3c.form)()
This utility is setup by hand, since its ZCML loads to many unwanted files:
>>> import zope.component
>>> import zope.i18n.negotiator
>>> zope.component.provideUtility(zope.i18n.negotiator.negotiator)
also define a helper method for test the widgets:
>>> from z3c.form import interfaces
>>> from z3c.form.testing import TestRequest
>>> def setupWidget(field):
... request = TestRequest()
... widget = zope.component.getMultiAdapter((field, request),
... interfaces.IFieldWidget)
... widget.id = 'foo'
... widget.name = 'bar'
... return widget
5.1. ASCII¶
>>> field = zope.schema.ASCII(default='This is\n ASCII.')
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.textarea.TextAreaWidget'>
>>> interfaces.IDataConverter(widget)
<FieldDataConverter converts from ASCII to TextAreaWidget>
>>> print(widget.render())
<textarea id="foo" name="bar" class="textarea-widget required ascii-field">This is
ASCII.</textarea>
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="textarea-widget required ascii-field">This is
ASCII.</span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="textarea-widget required ascii-field">This is
ASCII.</span>
</div>
</div>
As you can see, we will get an additional error class called row-error
if
we render a widget with an error view assinged:
>>> class DummyErrorView(object):
... def render(self):
... return 'Dummy Error'
>>> widget.error = (DummyErrorView())
>>> print(widget())
<div id="foo-row" class="row-error row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="textarea-widget required ascii-field">This is
ASCII.</span>
</div>
<div class="error">
Dummy Error
</div>
</div>
5.2. ASCIILine¶
>>> field = zope.schema.ASCIILine(default='An ASCII line.')
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<FieldDataConverter converts from ASCIILine to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar"
class="text-widget required asciiline-field" value="An ASCII line." />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required asciiline-field">An ASCII line.</span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="text-widget required asciiline-field">An ASCII line.</span>
</div>
</div>
5.3. Bool¶
>>> field = zope.schema.Bool(default=True, title=u"Check me", required=True)
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.radio.RadioWidget'>
>>> interfaces.IDataConverter(widget)
<SequenceDataConverter converts from Bool to RadioWidget>
>>> print(widget.render())
<span class="option">
<label for="foo-0">
<input type="radio" id="foo-0" name="bar"
class="radio-widget required bool-field" value="true"
checked="checked" />
<span class="label">yes</span>
</label>
</span><span class="option">
<label for="foo-1">
<input type="radio" id="foo-1" name="bar"
class="radio-widget required bool-field" value="false" />
<span class="label">no</span>
</label>
</span>
<input name="bar-empty-marker" type="hidden" value="1" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="radio-widget required bool-field"><span
class="selected-option">yes</span></span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span>Check me</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="radio-widget required bool-field"><span class="selected-option">yes</span></span>
</div>
</div>
For the boolean, the checkbox widget can be used as well:
>>> from z3c.form.browser import checkbox
>>> widget = checkbox.CheckBoxFieldWidget(field, TestRequest())
>>> widget.id = 'foo'
>>> widget.name = 'bar'
>>> widget.update()
>>> print(widget.render())
<span id="foo">
<span class="option">
<input type="checkbox" id="foo-0" name="bar:list"
class="checkbox-widget required bool-field" value="true"
checked="checked" />
<label for="foo-0">
<span class="label">yes</span>
</label>
</span><span class="option">
<input type="checkbox" id="foo-1" name="bar:list"
class="checkbox-widget required bool-field" value="false" />
<label for="foo-1">
<span class="label">no</span>
</label>
</span>
</span>
<input name="bar-empty-marker" type="hidden" value="1" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="checkbox-widget required bool-field"><span
class="selected-option">yes</span></span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span>Check me</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="checkbox-widget required bool-field"><span class="selected-option">yes</span></span>
</div>
</div>
We can also have a single checkbox button for the boolean.
>>> widget = checkbox.SingleCheckBoxFieldWidget(field, TestRequest())
>>> widget.id = 'foo'
>>> widget.name = 'bar'
>>> widget.update()
>>> print(widget.render())
<span class="option" id="foo">
<input type="checkbox" id="foo-0" name="bar:list"
class="single-checkbox-widget required bool-field"
value="selected" checked="checked" />
<label for="foo-0">
<span class="label">Check me</span>
</label>
</span>
<input name="bar-empty-marker" type="hidden" value="1" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo"
class="single-checkbox-widget required bool-field"><span
class="selected-option">Check me</span></span>
Note that the widget label is not repeated twice:
>>> widget.label
''
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="single-checkbox-widget required bool-field"><span class="selected-option">Check me</span></span>
</div>
</div>
5.5. Bytes¶
>>> field = zope.schema.Bytes(default=b'Default bytes')
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.file.FileWidget'>
>>> interfaces.IDataConverter(widget)
<FileUploadDataConverter converts from Bytes to FileWidget>
>>> print(widget.render())
<input type="file" id="foo" name="bar" class="file-widget required bytes-field" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> widget.render().strip('\r\n')
'<span id="foo" class="file-widget required bytes-field"></span>'
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="file-widget required bytes-field"></span>
</div>
</div>
5.6. BytesLine¶
>>> field = zope.schema.BytesLine(default=b'A Bytes line.')
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<FieldDataConverter converts from BytesLine to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar" class="text-widget required bytesline-field"
value="A Bytes line." />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required bytesline-field">A Bytes line.</span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="text-widget required bytesline-field">A Bytes line.</span>
</div>
</div>
5.7. Choice¶
>>> from zope.schema import vocabulary
>>> terms = [vocabulary.SimpleTerm(*value) for value in
... [(True, 'yes', 'Yes'), (False, 'no', 'No')]]
>>> vocabulary = vocabulary.SimpleVocabulary(terms)
>>> field = zope.schema.Choice(default=True, vocabulary=vocabulary)
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.select.SelectWidget'>
>>> interfaces.IDataConverter(widget)
<SequenceDataConverter converts from Choice to SelectWidget>
>>> print(widget.render())
<select id="foo" name="bar:list" class="select-widget required choice-field"
size="1">
<option id="foo-0" value="yes" selected="selected">Yes</option>
<option id="foo-1" value="no">No</option>
</select>
<input name="bar-empty-marker" type="hidden" value="1" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="select-widget required choice-field"><span
class="selected-option">Yes</span></span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="select-widget required choice-field"><span class="selected-option">Yes</span></span>
</div>
</div>
5.8. Date¶
>>> import datetime
>>> field = zope.schema.Date(default=datetime.date(2007, 4, 1))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<DateDataConverter converts from Date to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar" class="text-widget required date-field"
value="07/04/01" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required date-field">07/04/01</span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="text-widget required date-field">07/04/01</span>
</div>
</div>
5.9. Datetime¶
>>> field = zope.schema.Datetime(default=datetime.datetime(2007, 4, 1, 12))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<DatetimeDataConverter converts from Datetime to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar" class="text-widget required datetime-field"
value="07/04/01 12:00" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required datetime-field">07/04/01 12:00</span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="text-widget required datetime-field">07/04/01 12:00</span>
</div>
</div>
5.10. Decimal¶
>>> import decimal
>>> field = zope.schema.Decimal(default=decimal.Decimal('1265.87'))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<DecimalDataConverter converts from Decimal to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar" class="text-widget required decimal-field"
value="1,265.87" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required decimal-field">1,265.87</span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="text-widget required decimal-field">1,265.87</span>
</div>
</div>
5.11. Dict¶
There is no default widget for this field, since the sematics are fairly complex.
5.12. DottedName¶
>>> field = zope.schema.DottedName(default='z3c.form')
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<FieldDataConverter converts from DottedName to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar" class="text-widget required dottedname-field"
value="z3c.form" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required dottedname-field">z3c.form</span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="text-widget required dottedname-field">z3c.form</span>
</div>
</div>
5.13. Float¶
>>> field = zope.schema.Float(default=1265.8)
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<FloatDataConverter converts from Float to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar" class="text-widget required float-field"
value="1,265.8" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required float-field">1,265.8</span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="text-widget required float-field">1,265.8</span>
</div>
</div>
5.14. FrozenSet¶
>>> field = zope.schema.FrozenSet(
... value_type=zope.schema.Choice(values=(1, 2, 3, 4)),
... default=frozenset([1, 3]) )
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.select.SelectWidget'>
>>> interfaces.IDataConverter(widget)
<CollectionSequenceDataConverter converts from FrozenSet to SelectWidget>
>>> print(widget.render())
<select id="foo" name="bar:list" class="select-widget required frozenset-field"
multiple="multiple" size="5">
<option id="foo-0" value="1" selected="selected">1</option>
<option id="foo-1" value="2">2</option>
<option id="foo-2" value="3" selected="selected">3</option>
<option id="foo-3" value="4">4</option>
</select>
<input name="bar-empty-marker" type="hidden" value="1" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="select-widget required frozenset-field"><span
class="selected-option">1</span>, <span
class="selected-option">3</span></span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="select-widget required frozenset-field"><span class="selected-option">1</span>, <span class="selected-option">3</span></span>
</div>
</div>
5.15. Id¶
>>> field = zope.schema.Id(default='z3c.form')
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<FieldDataConverter converts from Id to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar" class="text-widget required id-field"
value="z3c.form" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required id-field">z3c.form</span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="text-widget required id-field">z3c.form</span>
</div>
</div>
5.17. Int¶
>>> field = zope.schema.Int(default=1200)
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<IntegerDataConverter converts from Int to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar" class="text-widget required int-field"
value="1,200" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required int-field">1,200</span>
5.18. List - ASCII¶
>>> field = zope.schema.List(
... value_type=zope.schema.ASCII(
... title='ASCII',
... default='This is\n ASCII.'),
... default=['foo\nfoo', 'bar\nbar'])
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>ASCII</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><textarea id="foo-0" name="bar.0"
class="textarea-widget required ascii-field">foo
foo</textarea>
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>ASCII</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><textarea id="foo-1" name="bar.1"
class="textarea-widget required ascii-field">bar
bar</textarea>
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.19. List - ASCIILine¶
>>> field = zope.schema.List(
... value_type=zope.schema.ASCIILine(
... title='ASCIILine',
... default='An ASCII line.'),
... default=['foo', 'bar'])
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>ASCIILine</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required asciiline-field"
value="foo" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>ASCIILine</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required asciiline-field"
value="bar" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.20. List - Choice¶
>>> field = zope.schema.List(
... value_type=zope.schema.Choice(values=(1, 2, 3, 4)),
... default=[1, 3] )
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.orderedselect.OrderedSelectWidget'>
>>> interfaces.IDataConverter(widget)
<CollectionSequenceDataConverter converts from List to OrderedSelectWidget>
>>> print(widget.render())
<script src="++resource++orderedselect_input.js" type="text/javascript"></script>
<table border="0" class="ordered-selection-field" id="foo">
<tr>
<td>
<select id="foo-from" name="bar.from" size="5"
multiple="multiple"
class="required list-field">
<option value="2">2</option>
<option value="4">4</option>
</select>
</td>
<td>
<button name="from2toButton" type="button"
value="→"
onclick="javascript:from2to('foo')">→</button>
<br />
<button name="to2fromButton" type="button"
value="←"
onclick="javascript:to2from('foo')">←</button>
</td>
<td>
<select id="foo-to" name="bar.to" size="5"
multiple="multiple" class="required list-field">
<option value="1">1</option>
<option value="3">3</option>
</select>
<input name="bar-empty-marker" type="hidden" />
<span id="foo-toDataContainer" style="display: none">
<script type="text/javascript">
copyDataForSubmit('foo');</script>
</span>
</td>
<td>
<button name="upButton" type="button" value="↑"
onclick="javascript:moveUp('foo')">↑</button>
<br />
<button name="downButton" type="button" value="↓"
onclick="javascript:moveDown('foo')">↓</button>
</td>
</tr>
</table>
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="required list-field"><span
class="selected-option">1</span>, <span
class="selected-option">3</span></span>
5.21. List - Date¶
>>> field = zope.schema.List(
... value_type=zope.schema.Date(
... title='Date',
... default=datetime.date(2007, 4, 1)),
... default=[datetime.date(2008, 9, 27), datetime.date(2008, 9, 28)])
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Date</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required date-field"
value="08/09/27" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Date</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required date-field"
value="08/09/28" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.22. List - Datetime¶
>>> field = zope.schema.List(
... value_type=zope.schema.Datetime(
... title='Datetime',
... default=datetime.datetime(2007, 4, 1, 12)),
... default=[datetime.datetime(2008, 9, 27, 12),
... datetime.datetime(2008, 9, 28, 12)])
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Datetime</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required datetime-field"
value="08/09/27 12:00" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Datetime</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required datetime-field"
value="08/09/28 12:00" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.23. List - Decimal¶
>>> field = zope.schema.List(
... value_type=zope.schema.Decimal(
... title='Decimal',
... default=decimal.Decimal('1265.87')),
... default=[decimal.Decimal('123.456'), decimal.Decimal('1')])
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Decimal</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required decimal-field"
value="123.456" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Decimal</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required decimal-field" value="1" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.24. List - DottedName¶
>>> field = zope.schema.List(
... value_type=zope.schema.DottedName(
... title='DottedName',
... default='z3c.form'),
... default=['z3c.form', 'z3c.wizard'])
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>DottedName</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required dottedname-field"
value="z3c.form" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>DottedName</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required dottedname-field"
value="z3c.wizard" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.25. List - Float¶
>>> field = zope.schema.List(
... value_type=zope.schema.Float(
... title='Float',
... default=123.456),
... default=[1234.5, 1])
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Float</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required float-field"
value="1,234.5" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Float</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required float-field" value="1.0" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.26. List - Id¶
>>> field = zope.schema.List(
... value_type=zope.schema.Id(
... title='Id',
... default='z3c.form'),
... default=['z3c.form', 'z3c.wizard'])
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Id</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required id-field"
value="z3c.form" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Id</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required id-field"
value="z3c.wizard" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.27. List - Int¶
>>> field = zope.schema.List(
... value_type=zope.schema.Int(
... title='Int',
... default=666),
... default=[42, 43])
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Int</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required int-field" value="42" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Int</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required int-field" value="43" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.28. List - Password¶
>>> field = zope.schema.List(
... value_type=zope.schema.Password(
... title='Password',
... default='mypwd'),
... default=['pwd', 'pass'])
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Password</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="password" id="foo-0" name="bar.0"
class="password-widget required password-field" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Password</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="password" id="foo-1" name="bar.1"
class="password-widget required password-field" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.29. List - SourceText¶
>>> field = zope.schema.List(
... value_type=zope.schema.SourceText(
... title='SourceText',
... default='<source />'),
... default=['<html></body>foo</body></html>', '<h1>bar</h1>'] )
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>SourceText</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><textarea id="foo-0" name="bar.0"
class="textarea-widget required sourcetext-field"><html></body>foo</body></html></textarea>
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>SourceText</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><textarea id="foo-1" name="bar.1"
class="textarea-widget required sourcetext-field"><h1>bar</h1></textarea>
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.30. List - Text¶
>>> field = zope.schema.List(
... value_type=zope.schema.Text(
... title='Text',
... default='Some\n Text.'),
... default=['foo\nfoo', 'bar\nbar'] )
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Text</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><textarea id="foo-0" name="bar.0"
class="textarea-widget required text-field">foo
foo</textarea>
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Text</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><textarea id="foo-1" name="bar.1"
class="textarea-widget required text-field">bar
bar</textarea>
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.31. List - TextLine¶
>>> field = zope.schema.List(
... value_type=zope.schema.TextLine(
... title='TextLine',
... default='Some Text line.'),
... default=['foo', 'bar'] )
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>TextLine</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required textline-field"
value="foo" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>TextLine</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required textline-field"
value="bar" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.32. List - Time¶
>>> field = zope.schema.List(
... value_type=zope.schema.Time(
... title='Time',
... default=datetime.time(12, 0)),
... default=[datetime.time(13, 0), datetime.time(14, 0)] )
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Time</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required time-field" value="13:00" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Time</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required time-field" value="14:00" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.33. List - Timedelta¶
>>> field = zope.schema.List(
... value_type=zope.schema.Timedelta(
... title='Timedelta',
... default=datetime.timedelta(days=3)),
... default=[datetime.timedelta(days=4), datetime.timedelta(days=5)] )
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Timedelta</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required timedelta-field"
value="4 days, 0:00:00" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Timedelta</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required timedelta-field"
value="5 days, 0:00:00" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.34. List - URI¶
>>> field = zope.schema.List(
... value_type=zope.schema.URI(
... title='URI',
... default='http://zope.org'),
... default=['http://www.python.org', 'http://www.zope.com'] )
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from List to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>URI</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required uri-field"
value="http://www.python.org" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>URI</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required uri-field"
value="http://www.zope.com" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.35. Object¶
By default, we are not going to provide widgets for an object, since we believe this is better done using sub-forms.
5.36. Password¶
>>> field = zope.schema.Password(default='mypwd')
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.password.PasswordWidget'>
>>> interfaces.IDataConverter(widget)
<FieldDataConverter converts from Password to PasswordWidget>
>>> print(widget.render())
<input type="password" id="foo" name="bar"
class="password-widget required password-field" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="password-widget required password-field">mypwd</span>
5.37. Set¶
>>> field = zope.schema.Set(
... value_type=zope.schema.Choice(values=(1, 2, 3, 4)),
... default=set([1, 3]) )
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.select.SelectWidget'>
>>> interfaces.IDataConverter(widget)
<CollectionSequenceDataConverter converts from Set to SelectWidget>
>>> print(widget.render())
<select id="foo" name="bar:list" class="select-widget required set-field"
multiple="multiple" size="5">
<option id="foo-0" value="1" selected="selected">1</option>
<option id="foo-1" value="2">2</option>
<option id="foo-2" value="3" selected="selected">3</option>
<option id="foo-3" value="4">4</option>
</select>
<input name="bar-empty-marker" type="hidden" value="1" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="select-widget required set-field"><span
class="selected-option">1</span>, <span
class="selected-option">3</span></span>
5.38. SourceText¶
>>> field = zope.schema.SourceText(default='<source />')
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.textarea.TextAreaWidget'>
>>> interfaces.IDataConverter(widget)
<FieldDataConverter converts from SourceText to TextAreaWidget>
>>> print(widget.render())
<textarea id="foo" name="bar"
class="textarea-widget required sourcetext-field"><source /></textarea>
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="textarea-widget required sourcetext-field"><source /></span>
5.39. Text¶
>>> field = zope.schema.Text(default='Some\n Text.')
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.textarea.TextAreaWidget'>
>>> interfaces.IDataConverter(widget)
<FieldDataConverter converts from Text to TextAreaWidget>
>>> print(widget.render())
<textarea id="foo" name="bar" class="textarea-widget required text-field">Some
Text.</textarea>
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="textarea-widget required text-field">Some
Text.</span>
5.40. TextLine¶
>>> field = zope.schema.TextLine(default='Some Text line.')
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<FieldDataConverter converts from TextLine to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar" class="text-widget required textline-field"
value="Some Text line." />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required textline-field">Some Text line.</span>
5.41. Time¶
>>> field = zope.schema.Time(default=datetime.time(12, 0))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<TimeDataConverter converts from Time to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar" class="text-widget required time-field"
value="12:00" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required time-field">12:00</span>
5.42. Timedelta¶
>>> field = zope.schema.Timedelta(default=datetime.timedelta(days=3))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<TimedeltaDataConverter converts from Timedelta to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar" class="text-widget required timedelta-field"
value="3 days, 0:00:00" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required timedelta-field">3 days, 0:00:00</span>
5.43. Tuple - ASCII¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.ASCII(
... title='ASCII',
... default='This is\n ASCII.'),
... default=('foo\nfoo', 'bar\nbar'))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>ASCII</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><textarea id="foo-0" name="bar.0"
class="textarea-widget required ascii-field">foo
foo</textarea>
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>ASCII</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><textarea id="foo-1" name="bar.1"
class="textarea-widget required ascii-field">bar
bar</textarea>
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.44. Tuple - ASCIILine¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.ASCIILine(
... title='ASCIILine',
... default='An ASCII line.'),
... default=('foo', 'bar'))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>ASCIILine</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required asciiline-field"
value="foo" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>ASCIILine</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required asciiline-field"
value="bar" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.45. Tuple - Choice¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.Choice(values=(1, 2, 3, 4)),
... default=(1, 3) )
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.orderedselect.OrderedSelectWidget'>
>>> interfaces.IDataConverter(widget)
<CollectionSequenceDataConverter converts from Tuple to OrderedSelectWidget>
>>> print(widget.render())
<script src="++resource++orderedselect_input.js" type="text/javascript"></script>
<table border="0" class="ordered-selection-field" id="foo">
<tr>
<td>
<select id="foo-from" name="bar.from" size="5"
multiple="multiple"
class="required tuple-field">
<option value="2">2</option>
<option value="4">4</option>
</select>
</td>
<td>
<button name="from2toButton" type="button"
value="→"
onclick="javascript:from2to('foo')">→</button>
<br />
<button name="to2fromButton" type="button"
value="←"
onclick="javascript:to2from('foo')">←</button>
</td>
<td>
<select id="foo-to" name="bar.to" size="5"
multiple="multiple" class="required tuple-field">
<option value="1">1</option>
<option value="3">3</option>
</select>
<input name="bar-empty-marker" type="hidden" />
<span id="foo-toDataContainer" style="display: none">
<script type="text/javascript">
copyDataForSubmit('foo');</script>
</span>
</td>
<td>
<button name="upButton" type="button" value="↑"
onclick="javascript:moveUp('foo')">↑</button>
<br />
<button name="downButton" type="button" value="↓"
onclick="javascript:moveDown('foo')">↓</button>
</td>
</tr>
</table>
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="required tuple-field"><span
class="selected-option">1</span>, <span
class="selected-option">3</span></span>
5.46. Tuple - Date¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.Date(
... title='Date',
... default=datetime.date(2007, 4, 1)),
... default=(datetime.date(2008, 9, 27), datetime.date(2008, 9, 28)))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Date</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required date-field"
value="08/09/27" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Date</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required date-field"
value="08/09/28" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.47. Tuple - Datetime¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.Datetime(
... title='Datetime',
... default=datetime.datetime(2007, 4, 1, 12)),
... default=(datetime.datetime(2008, 9, 27, 12),
... datetime.datetime(2008, 9, 28, 12)))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Datetime</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required datetime-field"
value="08/09/27 12:00" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Datetime</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required datetime-field"
value="08/09/28 12:00" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.48. Tuple - Decimal¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.Decimal(
... title='Decimal',
... default=decimal.Decimal('1265.87')),
... default=(decimal.Decimal('123.456'), decimal.Decimal('1')))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Decimal</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required decimal-field"
value="123.456" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Decimal</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required decimal-field" value="1" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.49. Tuple - DottedName¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.DottedName(
... title='DottedName',
... default='z3c.form'),
... default=('z3c.form', 'z3c.wizard'))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>DottedName</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required dottedname-field"
value="z3c.form" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>DottedName</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required dottedname-field"
value="z3c.wizard" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.50. Tuple - Float¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.Float(
... title='Float',
... default=123.456),
... default=(1234.5, 1))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Float</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required float-field"
value="1,234.5" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Float</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required float-field" value="1.0" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.51. Tuple - Id¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.Id(
... title='Id',
... default='z3c.form'),
... default=('z3c.form', 'z3c.wizard'))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Id</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required id-field"
value="z3c.form" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Id</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required id-field"
value="z3c.wizard" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.52. Tuple - Int¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.Int(
... title='Int',
... default=666),
... default=(42, 43))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Int</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required int-field" value="42" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Int</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required int-field" value="43" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.53. Tuple - Password¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.Password(
... title='Password',
... default='mypwd'),
... default=('pwd', 'pass'))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Password</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="password" id="foo-0" name="bar.0"
class="password-widget required password-field" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Password</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="password" id="foo-1" name="bar.1"
class="password-widget required password-field" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.54. Tuple - SourceText¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.SourceText(
... title='SourceText',
... default='<source />'),
... default=('<html></body>foo</body></html>', '<h1>bar</h1>'))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>SourceText</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><textarea id="foo-0" name="bar.0"
class="textarea-widget required sourcetext-field"><html></body>foo</body></html></textarea>
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>SourceText</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><textarea id="foo-1" name="bar.1"
class="textarea-widget required sourcetext-field"><h1>bar</h1></textarea>
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.55. Tuple - Text¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.Text(
... title='Text',
... default='Some\n Text.'),
... default=('foo\nfoo', 'bar\nbar'))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Text</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><textarea id="foo-0" name="bar.0"
class="textarea-widget required text-field">foo
foo</textarea>
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Text</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><textarea id="foo-1" name="bar.1"
class="textarea-widget required text-field">bar
bar</textarea>
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.56. Tuple - TextLine¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.TextLine(
... title='TextLine',
... default='Some Text line.'),
... default=('foo', 'bar'))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>TextLine</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required textline-field"
value="foo" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>TextLine</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required textline-field"
value="bar" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.57. Tuple - Time¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.Time(
... title='Time',
... default=datetime.time(12, 0)),
... default=(datetime.time(13, 0), datetime.time(14, 0)))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Time</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required time-field" value="13:00" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Time</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required time-field" value="14:00" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.58. Tuple - Timedelta¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.Timedelta(
... title='Timedelta',
... default=datetime.timedelta(days=3)),
... default=(datetime.timedelta(days=4), datetime.timedelta(days=5)))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>Timedelta</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required timedelta-field"
value="4 days, 0:00:00" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>Timedelta</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required timedelta-field"
value="5 days, 0:00:00" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.59. Tuple - URI¶
>>> field = zope.schema.Tuple(
... value_type=zope.schema.URI(
... title='URI',
... default='http://zope.org'),
... default=('http://www.python.org', 'http://www.zope.com'))
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.multi.MultiWidget'>
>>> interfaces.IDataConverter(widget)
<MultiConverter converts from Tuple to MultiWidget>
>>> print(widget.render())
<div class="multi-widget required">
<div id="foo-0-row" class="row">
<div class="label">
<label for="foo-0">
<span>URI</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-0-remove" name="bar.0.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-0" name="bar.0"
class="text-widget required uri-field"
value="http://www.python.org" />
</div>
</div>
</div>
<div id="foo-1-row" class="row">
<div class="label">
<label for="foo-1">
<span>URI</span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<div class="multi-widget-checkbox">
<input type="checkbox" value="1"
class="multi-widget-checkbox checkbox-widget"
id="foo-1-remove" name="bar.1.remove" />
</div>
<div class="multi-widget-input"><input type="text" id="foo-1" name="bar.1"
class="text-widget required uri-field"
value="http://www.zope.com" />
</div>
</div>
</div>
<div class="buttons">
<input type="submit" id="bar-buttons-add"
name="bar.buttons.add"
class="submit-widget button-field" value="Add" />
<input type="submit" id="bar-buttons-remove"
name="bar.buttons.remove"
class="submit-widget button-field" value="Remove selected" />
</div>
</div>
<input type="hidden" name="bar.count" value="2" />
5.60. URI¶
>>> field = zope.schema.URI(default='http://zope.org')
>>> widget = setupWidget(field)
>>> widget.update()
>>> widget.__class__
<class 'z3c.form.browser.text.TextWidget'>
>>> interfaces.IDataConverter(widget)
<FieldDataConverter converts from URI to TextWidget>
>>> print(widget.render())
<input type="text" id="foo" name="bar" class="text-widget required uri-field"
value="http://zope.org" />
>>> widget.mode = interfaces.DISPLAY_MODE
>>> print(widget.render())
<span id="foo" class="text-widget required uri-field">http://zope.org</span>
Calling the widget will return the widget including the layout
>>> print(widget())
<div id="foo-row" class="row-required row">
<div class="label">
<label for="foo">
<span></span>
<span class="required">*</span>
</label>
</div>
<div class="widget">
<span id="foo" class="text-widget required uri-field">http://zope.org</span>
</div>
</div>