Skip to content

Commit

Permalink
test form rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
gotcha committed Mar 12, 2010
1 parent af2b34a commit c04f98d
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 10 deletions.
80 changes: 71 additions & 9 deletions src/z3c/form/contentprovider.txt
Expand Up @@ -22,12 +22,13 @@ has to be registered for the ``ITextLine`` field::
>>> 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)

Expand Down Expand Up @@ -81,19 +82,19 @@ To insert content providers, the following steps are needed :
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'
Expand All @@ -113,9 +114,9 @@ To insert content providers, the following steps are needed :
>>> 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>'

Expand All @@ -130,7 +131,7 @@ We can also define content provider by adaptation::
... zope.interface.Interface),
... provides=IContentProvider, name='longHelp')

>>> class PersonForm(form.Form):
>>> class AdaptedPersonForm(form.Form):
... implements(IFieldsAndContentProviderForm)
... prefix = 'form.'
... fields = field.Fields(IPerson)
Expand All @@ -150,8 +151,69 @@ We can also define content provider by adaptation::
>>> 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>

5 changes: 4 additions & 1 deletion src/z3c/form/testing.py
Expand Up @@ -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

Expand Down Expand Up @@ -205,6 +205,9 @@ def setupFormDefaults():
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(
Expand Down

0 comments on commit c04f98d

Please sign in to comment.