2015-03-02 142 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.'))