2012-07-24 107 views
0

號我有兩個表:減少的選擇

db.define_table('tests', Field('name'), Field('status'),...) 
db.tests.status.requires=IS_IN_SET(['OK','obsolete']) 
db.define_table('testruns', Field('name'), Field('test', db.tests), ...) 

我的形式看起來LIK這樣的:

form = SQLFORM(db.testruns) 

我怎樣才能改變形式,它僅包含有狀態測試「好'?

回答

1

當您定義像Field('test', db.tests)這樣的引用字段時,它會獲取默認的IS_IN_DB驗證程序,該驗證程序在窗體中爲其提供默認選擇窗口小部件。 IS_IN_DB驗證程序默認爲引用字段中的所有記錄,但是您可以明確指定您自己的驗證程序並傳入DAL Set對象,該對象將記錄限制爲子集(在這種情況下,包含tests.status =='OK' ):

db.define_table('testruns', 
    Field('name'), 
    Field('test', db.tests, 
      requires=IS_IN_DB(db(db.tests.status == 'OK'), 'tests.id', '%(name)s'), 
      represent=lambda id, row: db.tests[id].name)) 
+0

好安東尼!在這種情況下代表如何工作?它是否使用此代碼訪問每個名稱的數據庫db.tests [id] .name? – 2012-07-25 07:23:41

+0

爲選擇小部件生成選項時,我認爲它只會執行一個查詢。但是,當使用'represent'屬性時(例如,當從testruns表中序列化一組行或顯示只讀表單時),我相信它會爲每條記錄執行一個單獨的數據庫查詢。 – Anthony 2012-07-25 21:11:11