我有一个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对象来提供模板所需的值,但是这个词汇表的计划最终是动态的,此时我希望我需要询问小部件本身。
我在这里做错了什么,为什么标题没有被定义?
答案 0 :(得分:0)
问题在于plone.supermodel
。我应该更清楚地提到我正在使用序列化模式来生成表单,我为此道歉。
基本上,plone.supermodel
提供导出/导入过程,只能处理简单的值列表。
# line 263 in plone.supermodel.exportimport
term = SimpleTerm(token = encoded, value = value, title = value)
解决方案是使用named vocabularies,它序列化对词汇表的引用而不是词汇本身。
再次抱歉,由于缺乏使调试更难的信息。