2

私は、現在静的な音声を使用している、のフォームを持ってい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'

したがって、ソースの語彙オブジェクトを直接使用してテンプレートに必要な値を提供することもできますが、この語彙は最終的に動的になる予定です。その時点で、ウィジェット自体に問い合わせる必要があると思います。

ここで何が間違っているのですか、なぜタイトルが定義されていないのですか?

4

1 に答える 1

0

問題はにありましたplone.supermodel。フォームを作成するためにシリアル化されたスキーマを使用していることをより明確に述べる必要がありました。これについてお詫び申し上げます。

基本的に、plone.supermodel値の単純なリストのみを処理できるエクスポート/インポートプロセスを提供します。

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

解決策は、語彙自体ではなく、語彙への参照をシリアル化する名前付き語彙を使用することでした。

これをデバッグするのを難しくした情報が不足していることを再度申し訳ありません。

于 2012-12-20T00:26:03.067 に答える