Forms 如何在z3c.form中生成所需的布尔字段?

Forms 如何在z3c.form中生成所需的布尔字段?,forms,plone,z3c.form,Forms,Plone,Z3c.form,我正在使用z3c.form在Plone 4.1.4中创建一个表单。我需要一个布尔字段,这是必需的:用户必须勾选该框。(在我的情况下,用户必须同意条款和条件。) 对字段使用required=True无效:我可以提交表单,而无需选中复选框 这就是我的代码的样子: from five import grok from plone.directives import form from zope import schema from z3c.form import button from Produ

我正在使用z3c.form在Plone 4.1.4中创建一个表单。我需要一个布尔字段,这是必需的:用户必须勾选该框。(在我的情况下,用户必须同意条款和条件。)

对字段使用
required=True
无效:我可以提交表单,而无需选中复选框

这就是我的代码的样子:

from five import grok
from plone.directives import form
from zope import schema
from z3c.form import button


from Products.CMFCore.interfaces import ISiteRoot
from Products.statusmessages.interfaces import IStatusMessage


class ITestSchema(form.Schema):
    hasApprovedConditions = schema.Bool(
        title=u'I agree to the Terms and Conditions.',
        required=True,
    )


class TestForm(form.SchemaForm):
    grok.name('test-form')
    grok.require('zope2.View')
    grok.context(ISiteRoot)

    schema = ITestSchema
    ignoreContext = True

    @button.buttonAndHandler(u'Send')
    def handleApply(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        IStatusMessage(self.request).addStatusMessage(u'Thanks', 'info')
        self.request.response.redirect(self.context.absolute_url())
表单显示了复选框和标签,但没有表明该字段是必需的,事实上它不是:我可以提交表单,而无需勾选复选框

我正在扩展这些已知的好集合:

他们将z3c.form绑定到版本2.5.1,但我也尝试了版本2.6.1


我缺少什么?

您应该使用如下约束:

def validateAccept(值):
如果不是值==True:
返回错误
返回真值
类ITestSchema(form.Schema):
hasApprovedConditions=schema.Bool(
title=u‘我同意条款和条件’,
必需=真,
constraint=validateacept,
)
更多信息:

要回应您在Mark van Lent注意到的“缺陷”,只需添加一个:

description=_(u'Required'),

我想我试过了。一定是弄错了。谢谢(唯一的“缺陷”是表单中的字段没有按照要求显式标记。)这里必须使用约束,就像Giacomo建议的那样,只有一个有效答案(不接受False)。在更一般的情况下(我意识到这不是它),只需要验证,其中True/False都被接受,但不能忽略一个值,我相信schema.Bool(required=True,default=None)与radio小部件配对将是最好的解决方案(复选框小部件可能存在一个明显的问题,即将False与省略的值混为一谈,这意味着复选框小部件是UI失败,但您描述的情况除外,它适合添加约束)。布尔值的性质是
false
true
none
不在范围内。Required定义,如果用户不勾选复选框,则必须给定一个值:它是
false
。仅限我的2Øre。