2

我有一个带有 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'

因此,虽然我可以直接使用源词汇对象来提供模板所需的值,但计划是让这个词汇最终成为动态的,此时我希望我需要询问小部件本身。

我在这里做错了什么,为什么没有定义标题?

4

1 回答 1

0

问题出在plone.supermodel. 我应该更清楚地提到我正在使用序列化模式来生成表单,对此我深表歉意。

基本上,plone.supermodel提供了一个导出/导入过程,它只能处理简单的值列表。

# line 263 in plone.supermodel.exportimport
term = SimpleTerm(token = encoded, value = value, title = value)

解决方案是使用命名词汇表,它将对词汇表的引用序列化,而不是对词汇表本身进行序列化。

再次抱歉,由于缺少信息使调试变得更加困难。

于 2012-12-20T00:26:03.067 回答