Validation 灵活性:在程序创建之前验证数据

Validation 灵活性:在程序创建之前验证数据,validation,plone,dexterity,Validation,Plone,Dexterity,当以编程方式创建敏捷类型时,是否可以验证传递给工厂的数据,就像它来自表单一样 我有一个灵巧的内容类型,有许多约束、不变量和验证器: 从zope导入模式 从zope导入接口 从z3c.form导入验证程序 从普隆进口灵巧 从plone.directions导入表单 来自五个进口国 def为_not_foo(值): 返回值不是“foo” 类IMyType(form.Schema): my_value=schema.TextLine( 约束=不是 ) min=schema.Int(默认值=0) max

当以编程方式创建敏捷类型时,是否可以验证传递给工厂的数据,就像它来自表单一样

我有一个灵巧的内容类型,有许多约束、不变量和验证器:

从zope导入模式
从zope导入接口
从z3c.form导入验证程序
从普隆进口灵巧
从plone.directions导入表单
来自五个进口国
def为_not_foo(值):
返回值不是“foo”
类IMyType(form.Schema):
my_value=schema.TextLine(
约束=不是
)
min=schema.Int(默认值=0)
max=schema.Int(默认值=99)
@界面不变量
def最大值大于最小值(数据):
如果data.min不是None,data.max不是None:
如果data.min>=data.max:
raise接口无效(u'Min大于Max')
@form.error\u消息(form=IMyType['my\u value'],error=schema.interfaces.constraintnotsuited)
def错误\u我的\u值\u为\u foo(值):
返回u'my_值不能是“foo”'
类ValidateMyValue(validator.SimpleFieldValidator):
def验证(自身、值):
如果值不是“无”:
#这个值通过了一些测试
validator.WidgetValidator鉴别器(
ValidateMyValue,
form=IMyType['my_value'],
)
全局适配器(ValidateMyValue)
为了确保MyType的所有实例都具有正确的默认值,我为其创建了一个自定义类,使用FieldProperty映射属性,并在类型的FTI声明中分配了它:

类MyType(灵巧度.内容.项目):
接口.实现(IMyType)
my_value=schema.fieldproperty.fieldproperty(IMyType['my_value'])
min=schema.fieldproperty.fieldproperty(IMyType['min'])
max=schema.fieldproperty.fieldproperty(IMyType['max'])
但是,当使用
plone.dexterity.utils.createContentInContainer
时,可以实例化不符合所施加的约束等的对象。理想情况下,我希望能够在创建之前自己执行此验证

有没有一个简单的方法我不知道?我简要介绍了collective.transmogrifier,但没有提到输入验证

谢谢。

您可以使用:


我试过这种方法。在验证数据之前调用
createContentInContainer
,如果违反了任何约束,就会引发异常,我宁愿避免单独处理。没有一个验证器类启动,可能是因为它们直接注册到表单上的小部件。不变量确实有效,但它们缺少我在其余验证中需要的上下文。我目前在创建项目之前对项目的模拟使用
getValidationErrors
,然后在指定的字段上手动运行验证器类,但这看起来很麻烦。
 newInstance = createContentInContainer(folder, id, **schemavalues)
 errors = getValidationErrors(IMyType, newInstance)
 if errors:
     # Schema not validated; errors is a sequence of (field, exception) tuples
     # field is None if the error is for an invariant.