2012-03-12 10 views
4

私はPlone 4.1.4でフォームを作成するためにz3c.formを使用しています。必要なブール値フィールドが必要です。ユーザーはボックスにチェックを入れなければなりません。 (私の場合は、利用規約に同意しなければなりません)z3c.formでbooleanフィールドを必須にするにはどうすればよいですか?

フィールドに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()) 

:私はせずにフォームを送信することができますチェックボックスにチェックを入れます。

彼らはバージョン2.5.1にz3c.formピンが、私はまた、バージョン2.6.1を試してみました:

は、私はこれらの既知の良好なセットを拡張しています。

私には何が欠けていますか?あなたは四旬節@マークバンの点に注意してください。 "欠陥" に対応するために

+3

Giacomoでは有効な回答が1つしかない(Falseは受け入れられない)ように、ここで制約を使用する必要があります。 True/Falseが両方とも受け入れられるが、値を省略できない検証が必要なより一般的なケースでは、schema.Bool(必須= True、デフォルト=なし)はラジオウィジェットが最適なソリューションになります(チェックボックスウィジェットと省略値のFalseが重なり合うという可能性のある問題があります。つまり、チェックボックスウィジェットは、あなたが記述した場合を除いてUIフェイルであり、制約に適しています加えた)。 – sdupton

+0

ブール値の性質は 'false'または' true'であり、 'none'はスコープ内にありません。 Requiredは値を与えなければならないことを定義します。ユーザがチェックボックスにチェックを入れていない場合もそうです。それは 'false'です。ちょうど私の2Øre。 –

答えて

8

あなたはこのように制約を使用する必要があります - を追加するだけです:

+2

私はそれを試みたと思った。間違いをしている必要があります。ありがとう。 (唯一の「瑕疵」は、フィールドが必須と明示的にラベル付けされていないということです)。 –

0

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, 
    ) 

詳細情報