[Checkins] SVN: z3c.form/branches/fieldsandcontentproviders/src/z3c/form/ test form rendering
Godefroid Chapelle
gotcha at bubblenet.be
Fri Mar 12 07:44:15 EST 2010
Log message for revision 109924:
test form rendering
Changed:
U z3c.form/branches/fieldsandcontentproviders/src/z3c/form/contentprovider.txt
U z3c.form/branches/fieldsandcontentproviders/src/z3c/form/testing.py
-=-
Modified: z3c.form/branches/fieldsandcontentproviders/src/z3c/form/contentprovider.txt
===================================================================
--- z3c.form/branches/fieldsandcontentproviders/src/z3c/form/contentprovider.txt 2010-03-12 11:43:36 UTC (rev 109923)
+++ z3c.form/branches/fieldsandcontentproviders/src/z3c/form/contentprovider.txt 2010-03-12 12:44:14 UTC (rev 109924)
@@ -22,12 +22,13 @@
>>> import zope.component
>>> import zope.interface
>>> from z3c.form import interfaces, widget
+ >>> from z3c.form.browser import text
>>> from z3c.form.testing import TestRequest
>>> @zope.component.adapter(zope.schema.TextLine, TestRequest)
... @zope.interface.implementer(interfaces.IFieldWidget)
... def TextFieldWidget(field, request):
- ... return widget.FieldWidget(field, widget.Widget(request))
+ ... return widget.FieldWidget(field, text.TextWidget(request))
>>> zope.component.provideAdapter(TextFieldWidget)
@@ -81,19 +82,19 @@
2. the class must have a ``contentProviders`` attribute that is an instance
of the ``ContentProviders`` class.
+::
+
>>> from z3c.form.contentprovider import ContentProviders
>>> from z3c.form.interfaces import IFieldsAndContentProviderForm
>>> class PersonForm(form.Form):
... implements(IFieldsAndContentProviderForm)
- ... prefix = 'form.'
... fields = field.Fields(IPerson)
... ignoreContext = True
... contentProviders = ContentProviders()
... contentProviders['longHelp'] = ExtendedHelp
- ... contentProviders['longHelp'].position = 2
+ ... contentProviders['longHelp'].position = 1
- >>> from z3c.form.testing import TestRequest
>>> request = TestRequest()
>>> class Person(object):
... id = 'james'
@@ -113,9 +114,9 @@
>>> widgets['longHelp']
<ExtendedHelp object at ...>
>>> widgets['id']
- <Widget 'form.widgets.id'>
+ <TextWidget 'form.widgets.id'>
>>> widgets['fullname']
- <Widget 'form.widgets.fullname'>
+ <TextWidget 'form.widgets.fullname'>
>>> manager.get('longHelp').render()
'<div class="ex-help">Help about person james</div>'
@@ -130,7 +131,7 @@
... zope.interface.Interface),
... provides=IContentProvider, name='longHelp')
- >>> class PersonForm(form.Form):
+ >>> class AdaptedPersonForm(form.Form):
... implements(IFieldsAndContentProviderForm)
... prefix = 'form.'
... fields = field.Fields(IPerson)
@@ -150,8 +151,69 @@
>>> widgets['longHelp']
<ExtendedHelp object at ...>
>>> widgets['id']
- <Widget 'form.widgets.id'>
+ <TextWidget 'form.widgets.id'>
>>> widgets['fullname']
- <Widget 'form.widgets.fullname'>
+ <TextWidget 'form.widgets.fullname'>
>>> manager.get('longHelp').render()
'<div class="ex-help">Help about person james</div>'
+
+Rendering the form
+------------------
+
+Once the update is complete we can render the form. Since we have not
+specified a template yet, we have to do this now. We have prepared a small and
+very simple template as part of this example:
+
+
+ >>> import os
+ >>> from z3c.form import ptcompat as viewpagetemplatefile
+ >>> from z3c.form import tests
+ >>> def personTemplate(form):
+ ... form.template = viewpagetemplatefile.bind_template(
+ ... viewpagetemplatefile.ViewPageTemplateFile(
+ ... 'simple_edit_with_providers.pt',
+ ... os.path.dirname(tests.__file__)), form)
+ >>> personTemplate(personForm)
+
+To enable form updating, all widget adapters must be registered::
+
+ >>> from z3c.form.testing import setupFormDefaults
+ >>> setupFormDefaults()
+
+Let's update the form before rendering it.
+
+ >>> personForm.update()
+
+Because ``personFrom`` implements ``IFieldsAndContentProviderForm``,
+computed widgets is a ``FieldWidgetsAndProviders`` instance.
+
+ >>> personForm.widgets
+ <z3c.form.contentprovider.FieldWidgetsAndProviders object at ...>
+
+Let's now render the page::
+
+ >>> print personForm.render()
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <body>
+ <form action=".">
+ <div class="row">
+ <label for="form-widgets-id">ID</label>
+ <input id="form-widgets-id" name="form.widgets.id"
+ class="text-widget required textline-field"
+ value="" type="text" />
+ </div>
+ <div class="row">
+ <div class="ex-help">Help about person james</div>
+ </div>
+ <div class="row">
+ <label for="form-widgets-fullname">FullName</label>
+ <input id="form-widgets-fullname"
+ name="form.widgets.fullname"
+ class="text-widget required textline-field"
+ value="" type="text" />
+ </div>
+ </form>
+ </body>
+ </html>
+
Modified: z3c.form/branches/fieldsandcontentproviders/src/z3c/form/testing.py
===================================================================
--- z3c.form/branches/fieldsandcontentproviders/src/z3c/form/testing.py 2010-03-12 11:43:36 UTC (rev 109923)
+++ z3c.form/branches/fieldsandcontentproviders/src/z3c/form/testing.py 2010-03-12 12:44:14 UTC (rev 109924)
@@ -34,8 +34,8 @@
from z3c.form import browser, button, converter, datamanager, error, field
from z3c.form import form, interfaces, term, validator, widget
+from z3c.form import contentprovider
from z3c.form.browser import radio, select, text, textarea
-from z3c.form.browser import file as fileWidget
from z3c.form.ptcompat import AVAILABLE
@@ -205,6 +205,9 @@
zope.component.provideAdapter(datamanager.AttributeField)
# Adapter to use form.fields to generate widgets
zope.component.provideAdapter(field.FieldWidgets)
+ # Adapter that uses form.fields to generate widgets
+ # AND interlace content providers
+ zope.component.provideAdapter(contentprovider.FieldWidgetsAndProviders)
# Adapters to lookup the widget for a field
# Text Field Widget
zope.component.provideAdapter(
More information about the checkins
mailing list