我有一个带有 a 的表单SelectFieldWidget
,它目前正在使用静态词汇,基本上是这样的:
from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
primary_contacts = SimpleVocabulary([
SimpleTerm( unicode(token), title=unicode(token.upper()), token=token ) for token in [
'one','two','three','four','five','six','seven','eight','nine','ten',
]
])
词汇表被分配给表单模式中的字段:
form.widget( primary_contact_person=SelectFieldWidget )
primary_contact_person = schema.List(
title = u'Nominate Primary Contact',
required = False,
value_type = schema.Choice(
vocabulary=primary_contacts,
)
)
然后使用 & 对模式进行序列化plone.supermodel
,然后在表单需要时反序列化(这是为了另一个要求)。
该表单使用自定义的手写模板,我正在添加tal
语句以生成选择字段选项。我原以为我可以通过引用表单上的小部件来做到这一点,但是当我这样做时,我遇到了一个问题:
(Pdb) self # break point in form
<Products.Five.metaclass.edit_metadata object at 0xc1ce450>
(Pdb) select = self.widgets['primary_contact_person']
(Pdb) first = [t for t in select.terms][0]
(Pdb) first.token
'one'
(Pdb) first.value
u'one'
(Pdb) first.title
(Pdb)
None
当通过小部件访问时,标题就在术语上。我试过通过词汇表来查找它:
(Pdb) select.terms.getTermByToken('one').title
(Pdb)
但同样,它是None
。但是,它存在于原始词汇对象中的术语:
(Pdb) from my.package import primary_contacts
(Pdb) [t for t in primary_contacts][0].title
u'ONE'
因此,虽然我可以直接使用源词汇对象来提供模板所需的值,但计划是让这个词汇最终成为动态的,此时我希望我需要询问小部件本身。
我在这里做错了什么,为什么没有定义标题?