SimpleTerm标题未设置

时间:2012-12-19 02:06:25

标签: plone vocabulary z3c.form

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

解决方案是使用named vocabularies,它序列化对词汇表的引用而不是词汇本身。

再次抱歉,由于缺乏使调试更难的信息。