4

私は Web2py を初めて使用し、カスタム バリデータを使用しようとしています。

class IS_NOT_EMPTY_IF_OTHER(Validator):

    def __init__(self, other,
                 error_message='must be filled because other value '
                               'is present'):
        self.other = other
        self.error_message = error_message

    def __call__(self, value):
        if isinstance(self.other, (list, tuple)):
            others = self.other
        else:
            others = [self.other]

        has_other = False
        for other in others:
            other, empty = is_empty(other)
            if not empty:
                has_other = True
                break
        value, empty = is_empty(value)
        if empty and has_other:
            return (value, T(self.error_message))
        else:
            return (value, None)

テーブルでの使用方法がわかりません:

db.define_table('numbers',

    Field('a', 'integer'),
    Field('b', 'boolean'),
    Field('c', 'integer')

「b」がチェックされているときに「c」を黒のままにできないように、これを使用したいと思います。

4

1 に答える 1

9

/modules/customvalidators.pyにコードを保存します

from gluon.validators import is_empty
from gluon.validators import Validator


class IS_NOT_EMPTY_IF_OTHER(Validator):

    def __init__(self, other,
                 error_message='must be filled because other value '
                               'is present'):
        self.other = other
        self.error_message = error_message

    def __call__(self, value):
        if isinstance(self.other, (list, tuple)):
            others = self.other
        else:
            others = [self.other]

        has_other = False
        for other in others:
            other, empty = is_empty(other)
            if not empty:
                has_other = True
                break
        value, empty = is_empty(value)
        if empty and has_other:
            return (value, T(self.error_message))
        else:
            return (value, None)

次にmodels/db.pyで

from customvalidator import IS_NOT_EMPTY_IF_OTHER

db.define_table("foo",
    Field('a', 'integer'),
    Field('b', 'boolean'),
    Field('c', 'integer')
)

# apply the validator
db.foo.c.requires = IS_NOT_EMPTY_IF_OTHER(request.vars.b)

また、上記のバリデーターがなくても簡単に実行できることに注意してください。上記のすべてのコードを忘れて、この単純化された方法を試してください

バージョン2:

controllers/default.py

def check(form):
    if form.vars.b and not form.vars.c:
        form.errors.c = "If the b is checked, c must be filled"

def action():
    form = SQLFORM(db.foo)
    if form.process(onvalidation=check).accepted:
        response.flash = "success"
    return dict(form=form)
于 2013-02-06T13:06:40.563 に答える