5

plone.directives.form.Schemaデフォルトを割り当てるためのフォームヒントがいくつかある、Dexterityコンテンツタイプがあります。

@form.default_value(field=ITrial['start_on'])
def default_start_on(data):
    return datetime.now()

デフォルトのいくつかはより複雑で、それ自体がDexterityタイプのインスタンスであるオブジェクトを返します。これらのオブジェクトは、さまざまなイベントによってトリガーされるメインタイプのセットアップに不可欠です。

現在、テスト中です。理想的には、次のようなものを使用できるようにしたいと思います。

item = createContentInContainer(folder, 'ctcc.model.trial', 'item')

つまり、コンストラクターに手動で渡さなくても、デフォルトがアイテムによって取得されるようにしたいと思います。

使用している場合はzope.schema、FieldPropertyを使用してスキーマフィールドへのプロキシを設定できます。器用さ、またはフォーム作成を通じてオブジェクトをプッシュするための関数に相当するものはありますか?

解決策: Davidのオプション#1、インターセプトを使用することになりましたObjectCreatedEvent

@grok.subscribe(ITrial, IObjectCreatedEvent)
def create_trial(trial, event):            
    if getattr(trial, 'start_on', None) is None:
        trial.start_on = default_start_on(None)

それでも、フォームの動作の一部を複製しているように感じますが、少なくとも、フォームのデフォルトを提供しているのと同じ関数を使用しています。

4

1 に答える 1

1

あなたが発見したように、 @form.default_value デコレーターは z3c.form フォームによって尊重されますが、アイテムが他の方法で作成されたときは尊重されません。いくつかのオプションがあります:

  1. 必要な既定値を設定するコンテンツ タイプの ObjectCreatedEvent のハンドラーを記述します。これは実装する最も簡単な方法ですが、値を配置する必要があるこのイベントの他のハンドラーがある場合は機能しない可能性があります。

  2. Dexterity のジェネリック Item クラスの独自のサブクラスを作成し、Item の代わりにそれをコンテンツ タイプの基礎として使用します。次に、メソッドをカスタマイズして、必要__init__なものを設定できます。ただし、既存のコンテンツ アイテムがある場合は、既存のコンテンツ アイテムの移行が必要になります。

  3. これはより複雑なオプションです。コンテンツ タイプの構築に使用されるファクトリ ユーティリティを置き換えます。createContentInContainer は、最終的に、コンテンツ タイプの FTI の factory 属性と同じ名前の IFactory ユーティリティを探します。デフォルトの実装はありplone.dexterity.factoryますが、より多くのことを行う別のものに置き換えることができます。

于 2012-08-02T00:58:39.727 に答える