2015-03-02 145 views
0

我有一个nsksystem表,它从两个字段nskmachinename和另一个表nskrelease的nskreleaseid获取值。 要求是nsksystem.nskreleaseid + nsksystem.nskmachinename应该是唯一的,nsksystem.nskreleaseid来自nskrlease数据库。我没有在表中强制执行任何约束。单个字段的多个验证器

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

而对于第二个要求,当我试图给的,而不是给我一个矛盾的输入期望的错误,票证被发布。

回答

1

如果您将IS_IN_DB验证程序放在列表中,它将不再生成选择窗口小部件。您可以使用_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.'))