[Zope3-Users] vocabulary of object-references
Gary Poster
gary at zope.com
Mon Aug 22 12:49:51 EDT 2005
On Aug 22, 2005, at 11:36 AM, Markus Leist wrote:
> Hi all,
>
> I have build an List of Choices and it works well:
> in interface:
> hostlist = List(
> title=_(u"Host List"),
> description=_(u"Host List"),
> value_type = Choice(
> title=_(u"Host"),
> description=_(u"Host"),
> required = True,
> vocabulary = "IkGroupHosts"),
> required=False)
>
> vocabulary:
> def HostsVocabulary(context):
> dynHostList = []
> for (oid, oobj) in iid.items():
> if IIkHost.providedBy(oobj.object):
> dynHostList.append( SimpleTerm( oobj.object.getIkTitle
> (), oobj.object.getIkTitle()))
> return SimpleVocabulary( dynHostList)
>
> object has string-result:
> hostlist [u'titan', u'radon']
>
> now i want to store references in (my new) lIst by vocabulary:
>
> def HostsVocabulary(context):
> dynHostList = []
> iid = zapi.getUtility( IIntIds, 'iid')
> for (oid, oobj) in iid.items():
> if IIkHost.providedBy(oobj.object):
> dynHostList.append( SimpleTerm( KeyReferenceToPersistent
> (oobj.object), oobj.object.getIkTitle()))
> return SimpleVocabulary( dynHostList)
Two things about this, based on a very quick look.
First, be aware that walking all of the intids for this is probably
pretty inefficient for the long haul, unless your app has a very,
very limited scope. Maybe this is a prototype, though, so that's cool.
Second, why are you using the key reference as the term value? Is it
necessary? Using the actual values should be more likely to give you
what you want. Because you are using, *the key references* are the
value being stored in your lists, not the actual objects.
> when commit the form:
> [...]
> File "/opt/ikom/Zope3/src/zope/schema/_bootstrapfields.py", line
> 133, in validate
> if value == self.missing_value:
> File "/opt/ikom/Zope3/src/zope/app/keyreference/persistent.py",
> line 56, in __cmp__
> if self.key_type_id == other.key_type_id:
> AttributeError: 'NoneType' object has no attribute 'key_type_id'
Right, so this is saying that the keyreference __cmp__ code expects
to only ever be compared with another keyreference, not None. This
could be changed, I suppose, if you actually intend to be storing the
keyreference. But I suggest the right thing to do for you is to just
use the actual value in the term.
Gary
More information about the Zope3-users
mailing list