2

Archetypes API 提供default_method()以编程方式填充初始值。

然而,由于这是一个类方法,它不适合archetypes.schemaextender。扩展器的等效方法是什么?

4

2 回答 2

4

如果没有 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.
于 2012-05-11T05:18:15.927 回答
2

这是使用 Mixin 类处理 archetypes.schemaextender 时 default_method() 的解决方案。字段初始值的代码应该在这样一个 mixin 类中名为“ 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。

于 2014-10-13T10:52:38.700 回答