=============== 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.app.component >>> import zope.app.security >>> import zope.i18n >>> import z3c.form >>> xmlconfig.XMLConfig('meta.zcml', zope.component)() >>> xmlconfig.XMLConfig('meta.zcml', zope.app.component)() >>> xmlconfig.XMLConfig('meta.zcml', zope.app.security)() >>> xmlconfig.XMLConfig('meta.zcml', zope.i18n)() >>> xmlconfig.XMLConfig('meta.zcml', z3c.form)() >>> xmlconfig.XMLConfig('configure.zcml', zope.app.security)() >>> 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 ASCII ----- >>> field = zope.schema.ASCII(default='This is\n ASCII.') >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() This is ASCII. ASCIILine --------- >>> field = zope.schema.ASCIILine(default='An ASCII line.') >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() An ASCII line. Bool ---- >>> field = zope.schema.Bool(default=True, title=u"Check me") >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() yes 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() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() yes 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() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() Check me Note that the widget label is not repeated twice: >>> widget.label u'' Button ------ >>> from z3c.form import button >>> field = button.Button(title=u'Press me!') >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() There exists an alternative widget for the button field, the button widget. It is not used by default, but available for use: >>> from z3c.form.browser.button import ButtonFieldWidget >>> widget = ButtonFieldWidget(field, TestRequest()) >>> widget.id = "foo" >>> widget.name = "bar" >>> widget.update() >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() Bytes ----- >>> field = zope.schema.Bytes(default='Default bytes') >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> widget.render().strip('\n') u'Default bytes' BytesLine --------- >>> field = zope.schema.BytesLine(default='A Bytes line.') >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() A Bytes line. 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__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() Yes Date ---- >>> import datetime >>> field = zope.schema.Date(default=datetime.date(2007, 4, 1)) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() 07/04/01 Datetime -------- >>> field = zope.schema.Datetime(default=datetime.datetime(2007, 4, 1, 12)) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() 07/04/01 12:00 Decimal ------- >>> import decimal >>> field = zope.schema.Decimal(default=decimal.Decimal('1265.87')) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() 1,265.87 Dict ---- There is no default widget for this field, since the sematics are fairly complex. DottedName ---------- >>> field = zope.schema.DottedName(default='z3c.form') >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() z3c.form Float ----- >>> field = zope.schema.Float(default=1265.8) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() 1,265.8 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__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() 1, 3 Id -- >>> field = zope.schema.Id(default='z3c.form') >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() z3c.form ImageButton ----------- Let's say we have a simple image field that uses the ``pressme.png`` image. >>> from z3c.form import button >>> field = button.ImageButton( ... image=u'pressme.png', ... title=u'Press me!') When the widget is created, the system converts the relative image path to an absolute image path by looking up the resource. For this to work, we have to setup some of the traversing machinery: # Traversing setup >>> from zope.traversing import testing >>> testing.setUp() # Resource namespace >>> import zope.component >>> from zope.traversing.interfaces import ITraversable >>> from zope.traversing.namespace import resource >>> zope.component.provideAdapter( ... resource, (None,), ITraversable, name="resource") >>> zope.component.provideAdapter( ... resource, (None, None), ITraversable, name="resource") # New absolute URL adapter for resources, if available >>> import zope.app.publisher.browser.resource >>> if hasattr(zope.app.publisher.browser.resource, 'AbsoluteURL'): ... zope.component.provideAdapter( ... zope.app.publisher.browser.resource.AbsoluteURL) # Register the "pressme.png" resource >>> from zope.app.publisher.browser.resource import Resource >>> testing.browserResource('pressme.png', Resource) Now we are ready to instantiate the widget: >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() Int --- >>> field = zope.schema.Int(default=1200) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() 1,200 List - ASCII ------------ >>> field = zope.schema.List( ... value_type=zope.schema.ASCII( ... title=u'ASCII', ... default='This is\n ASCII.'), ... default=['foo\nfoo', 'bar\nbar']) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - ASCIILine ---------------- >>> field = zope.schema.List( ... value_type=zope.schema.ASCIILine( ... title=u'ASCIILine', ... default='An ASCII line.'), ... default=['foo', 'bar']) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
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__ >>> interfaces.IDataConverter(widget) >>> print widget.render()


>>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() 1, 3 List - Date ----------- >>> field = zope.schema.List( ... value_type=zope.schema.Date( ... title=u'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__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - Datetime --------------- >>> field = zope.schema.List( ... value_type=zope.schema.Datetime( ... title=u'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__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - Decimal --------------- >>> field = zope.schema.List( ... value_type=zope.schema.Decimal( ... title=u'Decimal', ... default=decimal.Decimal('1265.87')), ... default=[decimal.Decimal('123.456'), decimal.Decimal('1')]) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - DottedName ----------------- >>> field = zope.schema.List( ... value_type=zope.schema.DottedName( ... title=u'DottedName', ... default='z3c.form'), ... default=[u'z3c.form', u'z3c.wizard']) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - Float ------------ >>> field = zope.schema.List( ... value_type=zope.schema.Float( ... title=u'Float', ... default=123.456), ... default=[1234.5, 1]) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - Id --------- >>> field = zope.schema.List( ... value_type=zope.schema.Id( ... title=u'Id', ... default='z3c.form'), ... default=['z3c.form', 'z3c.wizard']) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - Int ---------- >>> field = zope.schema.List( ... value_type=zope.schema.Int( ... title=u'Int', ... default=666), ... default=[42, 43]) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - Password --------------- >>> field = zope.schema.List( ... value_type=zope.schema.Password( ... title=u'Password', ... default=u'mypwd'), ... default=['pwd', 'pass']) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - SourceText ----------------- >>> field = zope.schema.List( ... value_type=zope.schema.SourceText( ... title=u'SourceText', ... default=u''), ... default=[u'foo', u'

bar

'] ) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - Text ----------- >>> field = zope.schema.List( ... value_type=zope.schema.Text( ... title=u'Text', ... default=u'Some\n Text.'), ... default=[u'foo\nfoo', u'bar\nbar'] ) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - TextLine --------------- >>> field = zope.schema.List( ... value_type=zope.schema.TextLine( ... title=u'TextLine', ... default=u'Some Text line.'), ... default=[u'foo', u'bar'] ) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - Time ----------- >>> field = zope.schema.List( ... value_type=zope.schema.Time( ... title=u'Time', ... default=datetime.time(12, 0)), ... default=[datetime.time(13, 0), datetime.time(14, 0)] ) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - Timedelta ---------------- >>> field = zope.schema.List( ... value_type=zope.schema.Timedelta( ... title=u'Timedelta', ... default=datetime.timedelta(days=3)), ... default=[datetime.timedelta(days=4), datetime.timedelta(days=5)] ) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
List - URI ---------- >>> field = zope.schema.List( ... value_type=zope.schema.URI( ... title=u'URI', ... default='http://zope.org'), ... default=['http://www.python.org', 'http://www.zope.com'] ) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Object ------ By default, we are not going to provide widgets for an object, since we believe this is better done using sub-forms. Password -------- >>> field = zope.schema.Password(default=u'mypwd') >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() mypwd 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__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() 1, 3 SourceText ---------- >>> field = zope.schema.SourceText(default=u'') >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() <source /> Text ---- >>> field = zope.schema.Text(default=u'Some\n Text.') >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() Some Text. TextLine -------- >>> field = zope.schema.TextLine(default=u'Some Text line.') >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() Some Text line. Time ---- >>> field = zope.schema.Time(default=datetime.time(12, 0)) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() 12:00 Timedelta --------- >>> field = zope.schema.Timedelta(default=datetime.timedelta(days=3)) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() 3 days, 0:00:00 Tuple - ASCII ------------- >>> field = zope.schema.Tuple( ... value_type=zope.schema.ASCII( ... title=u'ASCII', ... default='This is\n ASCII.'), ... default=('foo\nfoo', 'bar\nbar')) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - ASCIILine ----------------- >>> field = zope.schema.Tuple( ... value_type=zope.schema.ASCIILine( ... title=u'ASCIILine', ... default='An ASCII line.'), ... default=('foo', 'bar')) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
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__ >>> interfaces.IDataConverter(widget) >>> print widget.render()


>>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() 1, 3 Tuple - Date ------------ >>> field = zope.schema.Tuple( ... value_type=zope.schema.Date( ... title=u'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__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - Datetime ---------------- >>> field = zope.schema.Tuple( ... value_type=zope.schema.Datetime( ... title=u'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__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - Decimal ---------------- >>> field = zope.schema.Tuple( ... value_type=zope.schema.Decimal( ... title=u'Decimal', ... default=decimal.Decimal('1265.87')), ... default=(decimal.Decimal('123.456'), decimal.Decimal('1'))) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - DottedName ------------------ >>> field = zope.schema.Tuple( ... value_type=zope.schema.DottedName( ... title=u'DottedName', ... default='z3c.form'), ... default=(u'z3c.form', u'z3c.wizard')) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - Float ------------- >>> field = zope.schema.Tuple( ... value_type=zope.schema.Float( ... title=u'Float', ... default=123.456), ... default=(1234.5, 1)) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - Id ---------- >>> field = zope.schema.Tuple( ... value_type=zope.schema.Id( ... title=u'Id', ... default='z3c.form'), ... default=('z3c.form', 'z3c.wizard')) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - Int ----------- >>> field = zope.schema.Tuple( ... value_type=zope.schema.Int( ... title=u'Int', ... default=666), ... default=(42, 43)) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - Password ---------------- >>> field = zope.schema.Tuple( ... value_type=zope.schema.Password( ... title=u'Password', ... default=u'mypwd'), ... default=('pwd', 'pass')) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - SourceText ------------------ >>> field = zope.schema.Tuple( ... value_type=zope.schema.SourceText( ... title=u'SourceText', ... default=u''), ... default=(u'foo', u'

bar

')) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - Text ------------ >>> field = zope.schema.Tuple( ... value_type=zope.schema.Text( ... title=u'Text', ... default=u'Some\n Text.'), ... default=(u'foo\nfoo', u'bar\nbar')) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - TextLine ---------------- >>> field = zope.schema.Tuple( ... value_type=zope.schema.TextLine( ... title=u'TextLine', ... default=u'Some Text line.'), ... default=(u'foo', u'bar')) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - Time ------------ >>> field = zope.schema.Tuple( ... value_type=zope.schema.Time( ... title=u'Time', ... default=datetime.time(12, 0)), ... default=(datetime.time(13, 0), datetime.time(14, 0))) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - Timedelta ----------------- >>> field = zope.schema.Tuple( ... value_type=zope.schema.Timedelta( ... title=u'Timedelta', ... default=datetime.timedelta(days=3)), ... default=(datetime.timedelta(days=4), datetime.timedelta(days=5))) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
Tuple - URI ----------- >>> field = zope.schema.Tuple( ... value_type=zope.schema.URI( ... title=u'URI', ... default='http://zope.org'), ... default=('http://www.python.org', 'http://www.zope.com')) >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render()
URI --- >>> field = zope.schema.URI(default='http://zope.org') >>> widget = setupWidget(field) >>> widget.update() >>> widget.__class__ >>> interfaces.IDataConverter(widget) >>> print widget.render() >>> widget.mode = interfaces.DISPLAY_MODE >>> print widget.render() http://zope.org