我使用z3c.form在Plone 4.1.4中創建表單。我需要一個必需的布爾字段:用戶必須在框中打勾。 (在我的情況下,用戶必須同意條款和條件。)如何在z3c.form中創建所需的布爾字段?
對字段使用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())
窗體顯示覆選框和標籤,但沒有跡象表明該領域是必需的,的確是沒有,我可以提交表單,而不勾選複選框。
我擴展這些已知的良好集:
- http://dist.plone.org/release/4.1.4/versions.cfg
- http://good-py.appspot.com/release/dexterity/1.2?plone=4.1.4
他們束縛z3c.form到2.5.1版本,但我也試過版本2.6.1。
我錯過了什麼?
你必須在這裏使用約束,就像Giacomo建議只有一個有效答案一樣(False是不可接受的)。在更通用的情況下(我意識到這不是它),只需要驗證True/False都被接受,但值不能被忽略,我相信schema.Bool(required = True,default = None)配對一個無線電部件將是最好的解決方案(有一個明顯可能的問題,複選框小部件將False與忽略的值相混淆,這意味着複選框小部件是一個UI失敗,除了您描述的情況,它適合於約束添加)。 – sdupton 2012-03-12 19:33:22
布爾值的本質是「false」或「true」,「none」不在範圍內。必需定義,必須給出一個值,如果用戶沒有勾選複選框,也是如此:它是'false'。只是我的2Øre。 – 2013-12-12 14:52:48