[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