2012-03-21 15 views
5

私のPloneサイトの1つでは、文字を生成するために使用するいくつかの器用さのモデルがあります。モデルは、「モデル」(文字の基本内容)、「連絡先」(名前、住所などの連絡先情報を含む)、「マージ」(レンダリングされたモデルオブジェクトです。受信者情報を含むモデルの一部)。 オブジェクトの「マージ」のスキーマ以下の通りです:Plone and Dexterity: "relation"フィールドのデフォルト値

class IMergeSchema(form.Schema): 
    """ 
    """ 
    title = schema.TextLine(
     title=_p(u"Title"), 
     ) 

    form.widget(text='plone.app.z3cform.wysiwyg.WysiwygFieldWidget') 
    text = schema.Text(
     title=_p(u"Text"), 
     required=False, 
     ) 

    form.widget(recipients=MultiContentTreeFieldWidget) 
    recipients = schema.List(
     title=_('label_recipients', 
       default='Recipients'), 
     value_type=schema.Choice(
      title=_('label_recipients', 
         default='Recipients'), 
      # Note that when you change the source, a plone.reload is 
      # not enough, as the source gets initialized on startup. 
      source=UUIDSourceBinder(portal_type='Contact')), 
     ) 

    form.widget(model=ContentTreeFieldWidget) 
    form.mode(model='display') 
    model = schema.Choice(
     title=_('label_model', 
        default='Model'), 
     source=UUIDSourceBinder(portal_type='Model'), 
     ) 

新しい「マージ」オブジェクトを作成するとき、私は「受信者」フィールドはどこに新しいフォルダで利用可能なすべての連絡先をプリセットすることがしたいですオブジェクトが作成されます。 私はMartin Aspelliのガイドに従ってフィールドのデフォルト値を追加しました:http://plone.org/products/dexterity/documentation/manual/developer-manual/reference/default-value-validator-adaptors

これはテキスト入力フィールドでは問題ありませんが、「受信者」フィールドでは機能しません。デフォルト値を生成するための方法は以下の通りである(醜いプリントといくつかのデバッグ情報を持つが、彼らは後に削除されます;)):

@form.default_value(field=IMergeSchema['recipients']) 
def all_recipients(data): 
    contacts = [x for x in data.context.contentValues() 
       if IContact.providedBy(x)] 
    paths = [u'/'.join(c.getPhysicalPath()) for c in contacts] 
    uids = [IUUID(c, None) for c in contacts] 

    print 'Contacts: %s' % contacts 
    print 'Paths: %s' % paths 
    print 'UIDs: %s' % uids 

    return paths 

私は、直接それらの相対的なパスをオブジェクトを返すようにしようとした(中追加ビューは "self.widgets ['recipient']。value"にアクセスするときに、このタイプのデータを取得します)UIDですが、何の効果もありません。

リストやジェネレータの代わりにタプルを返そうとしましたが、まったく効果がありません。

このメソッドは、インスタンスログにトレースが表示されるので、確実に呼び出されます。

答えて

3

あなたは関連するコンテンツの "int_id"を取得する必要があると思います。それが器用性の関係フィールドが関係情報をどのように格納するかです::

from zope.component import getUtility 
from zope.intid.interfaces import IIntIds 

@form.default_value(field=IMergeSchema['recipients']) 
def all_recipients(data): 
    contacts = [x for x in data.context.contentValues() 
       if IContact.providedBy(x)] 
    intids = getUtility(IIntIds) 
    # The following gets the int_id of the object and turns it into 
    # RelationValue 
    values = [RelationValue(intids.getId(c)) for c in contacts] 

    print 'Contacts: %s' % contacts 
    print 'Values: %s' % values 

    return values