单个字段的多个验证器

Multiple Validators for a single field

我有一个 table nsksystem,它正在从另一个 table nskrelease 获取其两个字段 nskmachinename 和 nskreleaseid 的值。 要求是 nsksystem.nskreleaseid + nsksystem.nskmachinename 应该是唯一的并且 nsksystem.nskreleaseid 来自 nskrlease 数据库。我没有在 table.

中强制执行任何约束
db.define_table('nsksystem',
    Field('nskuserid',length=512,requires=IS_EMAIL(error_message='invalid email!'),default = auth.user.email if auth.user else None, label=T('Email ID'),writable=False),
    Field('nskmachinename', length=128, requires = IS_IN_DB(db,'nskrelease.nskname','%(nskname)s',error_message='Machine not registerd for release.'), label = T('Machine Name')),
    Field('nskpassword', 'password', length=512,readable=False, label=T('Machine Password')),
    Field('nskreleaseid',length=128, default='',label = T('Release'))
)

db.nsksystem.nskreleaseid.requires = [IS_IN_DB(db,'nskrelease.releaseid'), IS_NOT_IN_DB(db(db.nsksystem.nskmachinename == request.vars.nskmachinename), 'nsksystem.releaseid', error_message='Machine is already registered to the specified release.')]

在上面的代码中,第一个要求是强制执行的,但我没有看到

的下拉列表
IS_IN_DB(db,'nskrelease.releaseid')

对于第二个要求,当我尝试提供有冲突的输入而不是给我所需的错误时,发出了一张罚单。

如果您将 IS_IN_DB 验证器放在列表中,它将不再生成 select 小部件。您可以使用 _and 参数,而不是将验证器放在列表中:

db.nsksystem.nskreleaseid.requires = IS_IN_DB(db, 'nskrelease.releaseid',
    _and=IS_NOT_IN_DB(db(db.nsksystem.nskmachinename == request.vars.nskmachinename),
                      'nsksystem.releaseid',
                      error_message='Machine is already registered to the specified release.'))