2012-12-19 30 views
2

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

因此,虽然我可以直接使用源翻译对象提供的值模板的需求,该计划是为这个词汇最终是动态的,在这一点上,我希望我需要审查小部件本身。

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

+0

这对我来说是一个臭味......唯一能找到的方法可能是通过所有的z3c.form进行一步调试,然后看看进程被*标题* –

+0

旁边跟踪的问题根本无法重现您的问题,而不是像你那样在Python提示符中定义'SimpleVocabulary'。另外,为了获得迭代的第一个元素,只需使用'next(select.terms)':-) –

+0

哈,谢谢Martijn,我不知道为什么我从来没有发现过:) –

回答

0

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

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

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

的解决方案是使用named vocabularies,该串行化参照词汇而不是词汇本身。

对不起,由于缺乏信息,这使得更难以调试。