[Zope3-Users] problems with contains and containers
Lorenzo Gil Sanchez
lgs at sicem.biz
Tue Mar 21 13:10:52 EST 2006
Hi,
I have a custom container and a custom content type and I want to make
some simple restrictions:
- Only objects that implement IMyContent can be added to objects that
implement IMyContainer
- Only objects that implement IMyContainer can contain objects that
implement IMyContent
Looks like the typical example. I implemented it following Stephan book
instructions and it worked well. The only issue was that I was getting
the feeling that splitting the interface in two and having something
like IMyContent, IMyContentContained was a little bit ugly.
Then I read about 'contains' and 'containers' and that they allowed me
to keep the interfaces together because I could use strings as their
arguments with the path for the other interfaces. Much nicer indeed. So
here is my little demo code:
from persistent import Persistent
from zope.app.container.interfaces import IContainer, IContained
from zope.app.container.constraints import contains, containers
from zope.app.container.contained import Contained
from zope.app.container.btree import BTreeContainer
from zope.interface import implements
class IMyContent(IContained):
containers('.IMyContainer')
class IMyContainer(IContainer):
contains(IMyContent)
class MyContent(Persistent, Contained):
implements(IMyContent)
class MyContainer(BTreeContainer):
implements(IMyContainer)
And in my browser package I have defined add views for both content
types. Then I start Zope and create an instance of MyContainer in the
root folder. I go into this objects and in the right hand add menu I see
the only object I can add is MyContent. So far so good. The problem is
when I try to get to the add form of MyContent. I get this error:
2006-03-21T18:58:13 ERROR SiteError http://localhost:8080/a/@@
+/action.html
Traceback (most recent call last):
File
"/usr/local/src/Zope-3.2.0/build/lib.linux-i686-2.4/zope/publisher/publish.py", line 138, in publish
result = publication.callObject(request, object)
File
"/usr/local/src/Zope-3.2.0/build/lib.linux-i686-2.4/zope/app/publication/zopepublication.py", line 161, in callObject
return mapply(ob, request.getPositionalArguments(), request)
File
"/usr/local/src/Zope-3.2.0/build/lib.linux-i686-2.4/zope/publisher/publish.py", line 113, in mapply
return debug_call(object, args)
File
"/usr/local/src/Zope-3.2.0/build/lib.linux-i686-2.4/zope/publisher/publish.py", line 119, in debug_call
return object(*args)
File
"/usr/local/src/Zope-3.2.0/build/lib.linux-i686-2.4/zope/app/container/browser/adding.py", line 128, in action
name=view_name) is not None:
File
"/usr/local/src/Zope-3.2.0/build/lib.linux-i686-2.4/zope/component/__init__.py", line 165, in queryMultiAdapter
return sitemanager.queryMultiAdapter(objects, interface, name,
default)
File
"/usr/local/src/Zope-3.2.0/build/lib.linux-i686-2.4/zope/component/site.py", line 75, in queryMultiAdapter
default)
File
"/usr/local/src/Zope-3.2.0/build/lib.linux-i686-2.4/zope/interface/adapter.py", line 475, in queryMultiAdapter
return factory(*objects)
File
"/usr/local/src/Zope-3.2.0/build/lib.linux-i686-2.4/zope/app/form/browser/editview.py", line 64, in __init__
self._setUpWidgets()
File
"/usr/local/src/Zope-3.2.0/build/lib.linux-i686-2.4/zope/app/form/browser/add.py", line 49, in _setUpWidgets
setUpWidgets(self, self.schema, IInputWidget, names=self.fieldNames)
File "/home/lgs/zope/Zope-3.2/lib/python/zope/app/form/utility.py",
line 153, in setUpWidgets
context=context)
File "/home/lgs/zope/Zope-3.2/lib/python/zope/app/form/utility.py",
line 97, in setUpWidget
widget = _createWidget(context, field, viewType, view.request)
File "/home/lgs/zope/Zope-3.2/lib/python/zope/app/form/utility.py",
line 65, in _createWidget
return zapi.getMultiAdapter((field, request), viewType)
File
"/usr/local/src/Zope-3.2.0/build/lib.linux-i686-2.4/zope/component/__init__.py", line 154, in getMultiAdapter
raise ComponentLookupError(objects, interface, name)
ComponentLookupError: ((<zope.schema._bootstrapfields.Field object at
0xb52e44ec>, <zope.publisher.browser.BrowserRequest instance
URL=http://localhost:8080/a/@@+/action.html>), <InterfaceClass
zope.app.form.interfaces.IInputWidget>, u'')
And it didn't happen with my old code with splitted interfaces.
Any idea?
thanks in advance
Lorenzo Gil
More information about the Zope3-users
mailing list