2012-03-12 1 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 (обязательно = True, default = None) в паре с Лучшим решением будет виджет радио (существует четкая возможная проблема виджета флажка, объединяющего False с пропущенным значением, что означает, что виджет флажка является сбоем пользовательского интерфейса, за исключением случая, который вы описываете, к которому он подходит с ограничением добавлено). – sdupton

+0

Характер булевых символов должен быть либо «ложным», либо «истинным», «none» не входит в сферу действия. Обязательный определяет, что необходимо указать значение, которое также имеет место, если пользователь не поставил галочку в поле: это 'false'. Просто мои 2 Øre. –

ответ

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

Я думал, что попробовал это. Должно быть, ошибся. Благодарю. (Единственным «недостатком» является то, что в форме поле явно не помечено как требуется.) –

0

ответить на "изъян" вы отмечаете @Mark ван Поста - просто добавьте:

description=_(u'Required'),