[Product-Developers] Re: z3c.form with Boring

Martin Aspeli optilude+lists at gmail.com
Mon Mar 23 01:22:41 UTC 2009


Hi David,

> I'm playing with a simple product called JWFind, derived from Boring
> (http://www.zope.org/Members/gtk/Boring) now. The product sits in the
> products directory, can be added and removed using ZMI, it seems OK.

Note that Boring is 8.5 years old. I haven't looked at it, but I really 
doubt it follows current best practice. If you want a starting point, I 
suggest you install ZopeSkel and use the 'plone' template.

> Because I'm willing to use it in Plone, the Zope version is 2.10.6-final.
> 
> Now, I'm trying to handle the view of product using form made of
> z3c.form. There is a problem. Currently, I'm getting
> 
> Traceback (innermost last):
>   Module ZPublisher.Publish, line 119, in publish
>   Module ZPublisher.mapply, line 88, in mapply
>   Module ZPublisher.Publish, line 42, in call_object
>   Module Products.JWFind.JWFind, line 55, in index_html
>   Module z3c.form.form, line 189, in __call__
>   Module z3c.form.form, line 184, in update
>   Module z3c.form.form, line 134, in update
>   Module z3c.form.form, line 120, in updateWidgets
>   Module zope.component._api, line 103, in getMultiAdapter
>   Module zope.component._api, line 103, in getMultiAdapter
> ComponentLookupError: ((<Products.JWFind.Person.Person object at
> 0xb5003b2c>, <HTTPRequest, URL=http://localhost:8091/pokus/index_html>,
> <JWFind at /pokus>), <InterfaceClass z3c.form.interfaces.IWidgets>, u'')

It looks like oyu haven't wired up z3c.form properly. You need to use 
plone.z3cform if you're using z3c.form in Plone. Look at its README for 
details.

> I guess, the error tells, that something implementing ``IWidgets``
> cannot be found. But, I have no idea, how to deal with it. Maybe, should
> I prepare the specific layer and skin to be able to use z3cforms and If
> so, how to do it and especially how to register it properly? Or is there
> a problem with the form definition itself? Or should I register
> something to zope in addition to registration made in __init__?

plone.z3cform takes care of this. The registration is in configure.zcml 
these days. We tend to keep our __init__.py's empty if we can (AT 
content types being the big example).

> The relevant part of product source JWFind.py:
> 
>     def index_html(self, REQUEST=None):
> 	"""JWFind Form"""
> 	out = Person(self, REQUEST)()
> 	return out.PersonView

This may work, but it's not really how you're meant to build forms. 
Please look at the plone.z3cform and z3c.form documentation on pypi.

> The form is in separate file Person.py:
> 
> from zope import interface, schema
> from z3c.form import form, field, button
> from plone.app.z3cform.layout import wrap_form
> 
> class IPerson(interface.Interface):
>     age = schema.Int(
> 	title=u"Age",
> 	required=True)
> 
> class Person(form.Form):
>      fields = field.Fields(IPerson)
>      ignoreContext = True # don't use context to get widget data
>      label = u"Please enter your age"
> 
>      @button.buttonAndHandler(u'Apply')
>      def handleApply(self, action):
>          data, errors = self.extractData()
>          print data['age'] # ... or do stuff
> 
> PersonView = wrap_form(Person)

Ah, I see that you *are* using plone.z3cform. In this case, just make 
sure your PersonView is registered with browser:page and that 
plone.z3cform's ZCML is loaded. You should then be able to access that. 
The index_html() thing is almost certainly wrong.

Martin

-- 
Author of `Professional Plone Development`, a book for developers who
want to work with Plone. See http://martinaspeli.net/plone-book





More information about the Product-Developers mailing list