Как сделать логическое поле обязательным в 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 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.

Что мне не хватает?


person Mark van Lent    schedule 12.03.2012    source источник
comment
Здесь вы должны использовать ограничение, например, Джакомо предлагает иметь только один правильный ответ (False неприемлем). В более общем случае (я понимаю, что это не так), когда просто требуется проверка, когда оба значения True/False принимаются, но значение не может быть опущено, я считаю, что schema.Bool(required=True, default=None) в паре с радио-виджет будет лучшим решением (существует отдельная возможная проблема виджета флажка, объединяющего False с пропущенным значением, что означает, что виджет флажка - это сбой пользовательского интерфейса, за исключением случая, который вы описываете, для которого он подходит с ограничением добавлен).   -  person sdupton    schedule 12.03.2012
comment
Природа логических значений должна быть либо false, либо true, none не входит в область действия. Required определяет, что значение должно быть задано, что также имеет место, если пользователь не отмечает флажок: это false. Просто мой 2 Øre.   -  person Ida    schedule 12.12.2013


Ответы (2)


Вы должны использовать такое ограничение:

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

Подробнее:

person Giacomo Spettoli    schedule 12.03.2012
comment
Я думал, что пробовал это. Должно быть, ошибся. Спасибо. (Единственный «недостаток» заключается в том, что в форме поле явно не помечено как обязательное.) - person Mark van Lent; 12.03.2012

чтобы ответить на «недостаток», который вы заметили @Mark van Lent, просто добавьте:

description=_(u'Required'),
person Don Keillor    schedule 23.07.2013