2012-12-19 60 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,該串行化參照詞彙而不是詞彙本身。

對不起,由於缺乏信息,這使得更難以調試。