Archetypes APIはdefault_method()
、プログラムで初期値を設定するために提供されています。
ただし、これはクラスメソッドであるため、archetypes.schemaextenderには適していません。エクステンダーと同等のアプローチは何でしょうか?
Archetypes APIはdefault_method()
、プログラムで初期値を設定するために提供されています。
ただし、これはクラスメソッドであるため、archetypes.schemaextenderには適していません。エクステンダーと同等のアプローチは何でしょうか?
field.defaultもfield.default_methodもない場合は、IFieldDefaultProviderアダプターを使用できます。Archetypes.Field.FieldクラスのgetDefaultメソッドからの次のコードスニペットを参照してください。
if not self.default:
default_adapter = component.queryAdapter(instance, IFieldDefaultProvider, name=self.__name__)
if default_adapter is not None:
return default_adapter()
また、IFieldDefaultProvider:
class IFieldDefaultProvider(Interface):
"""Register a named adapter for your content type providing
this interface, with a name that is equal to the name of a
field. If no default or default_method is set on that field
explicitly, Archetypes will find and call this adapter.
"""
def __call__():
"""Get the default value.
これは、Mixinクラスを使用してarchetypes.schemaextenderを操作する場合のdefault_method()のソリューションです。filedの初期値のコードは、このようなミックスインクラス内の「 getDefault 」という名前のメソッドにある必要があります。このメソッドは、拡張フィールドの宣言の前に配置します。
class ProvideDefaultValue:
""" Mixin class to populate an extention field programmatically """
def getDefault(self, instance):
""" Getting value from somewhere (in this ex. from same field of the parent) """
parent = aq_parent(instance)
if hasattr(parent, 'getField'):
parentField = parent.getField(self.__name__)
if parentField is not None:
return parentField.getAccessor(parent)
これで、このメソッドを対応する拡張クラス宣言に含めることができます。
class StringFieldPrefilled(ExtensionField, ProvideDefaultValue, atapi.StringField):
""" Extention string field, with default value prefilled from parent. """
注:拡張スキーマフィールド定義にdefault_methodを追加する必要はありません。