我有一个SelectFieldWidget
一种形式,目前正在使用一个静态vocabularly,这基本上是这样的:SimpleTerm标题未设置
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'
因此,虽然我可以直接使用源翻译对象提供的值模板的需求,该计划是为这个词汇最终是动态的,在这一点上,我希望我需要审查小部件本身。
我在做什么错在这里,为什么标题没有被定义?
这对我来说是一个臭味......唯一能找到的方法可能是通过所有的z3c.form进行一步调试,然后看看进程被*标题* –
旁边跟踪的问题根本无法重现您的问题,而不是像你那样在Python提示符中定义'SimpleVocabulary'。另外,为了获得迭代的第一个元素,只需使用'next(select.terms)':-) –
哈,谢谢Martijn,我不知道为什么我从来没有发现过:) –