Plone:根据其他字段的值验证字段

Plone: Validate field based on other field's value

假设我们有一个包含两个字段的灵巧内容类型:field_afield_b

在编辑模式中:

这里似乎无法进行简单的验证。我试过了:

from zope.interface import Invalid

def validate_field_b(value):
    # value is a string here. I can't create a condition based on field_a.
    raise Invalid(_(u"Value in field b is required."))

此处使用:

field_b = schema.TextLine(
    title=_(u"Some field B"),
    required=False,
    constraint=validate_field_b
)

结果是field_b一直需要。 :)

这里有什么解决办法吗?如何在我的验证器中获取表单/上下文/请求/其他字段值?

解决方案是使用 invariant 而不是 constrainthttps://docs.plone.org/external/plone.app.dexterity/docs/advanced/validators.html#invariants

@invariant
def validate_field_b(data):
    if data.field_a != 'category_1' and data.field_b is None:
        raise Invalid(_("Missing input for field_b."))