2012-03-12 17 views
4

我使用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()) 

窗體顯示覆選框和標籤,但沒有跡象表明該領域是必需的,的確是沒有,我可以提交表單,而不勾選複選框。

我擴展這些已知的良好集:

他們束縛z3c.form到2.5.1版本,但我也試過版本2.6.1。

我錯過了什麼?

+3

你必須在這裏使用約束,就像Giacomo建議只有一個有效答案一樣(False是不可接受的)。在更通用的情況下(我意識到這不是它),只需要驗證True/False都被接受,但值不能被忽略,我相信schema.Bool(required = True,default = None)配對一個無線電部件將是最好的解決方案(有一個明顯可能的問題,複選框小部件將False與忽略的值相混淆,這意味着複選框小部件是一個UI失敗,除了您描述的情況,它適合於約束添加)。 – sdupton 2012-03-12 19:33:22

+0

布爾值的本質是「false」或「true」,「none」不在範圍內。必需定義,必須給出一個值,如果用戶沒有勾選複選框,也是如此:它是'false'。只是我的2Øre。 – 2013-12-12 14:52:48

回答

8

你應該使用這樣的約束:

def validateAccept(value): 
    if not value == True: 
     return False 
    return True 

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

更多信息

+2

我以爲我嘗試過。一定是犯了一個錯誤。謝謝。 (唯一的'缺陷'是在表單中該字段沒有明確標註爲必填項。) – 2012-03-12 16:50:10

0

向 「缺陷」 迴應你注意@馬克麪包車四旬 - 只需添加一個:

description=_(u'Required'), 
相關問題