2014-01-23 20 views
0

考慮auth_user表,一個簡單的歌曲表和一個所有者表。考慮一首歌只有一個作者是登錄用戶,只能由一個所有者擁有。還要考慮到用戶可以擁有許多已知的潛在所有者。web2py,創建一個用戶自己可以選擇的事物下拉表單

主表:

db.define_table(
    'owner', 
    Field('user_id', 'reference auth_user'), 
    Field('name'), 
    Field('first_name'), 
    Field('telephone'), 
    format = '%(name)s, %(first_name)s' 
    ) 

歌曲表

db.define_table(
    'song', 
    Field('user_id', 'reference auth_user'), 
    Field('owner_id', 'reference owner', requires=IS_EMPTY_OR(IS_IN_DB(db, db.owner.id))), 
    Field('name'), 
    Field('description', 'text'), 
    ) 

在控制器考慮一個簡單的函數:

def create(): 
    form = SQLFORM(db.song).process(next=URL('index')) 
    return dict(form=form) 

我想創建一個表單中,用戶可以指定歌曲的知名所有者。可悲的是,現在用戶可以將其他用戶的已知所有者分配給他們的歌曲。

我該怎麼做才能確保表單只列出用戶的已知所有者?有沒有辦法在數據庫層執行此操作來防止ID注入和owner_id捕魚?

謝謝

回答

1

的第一個參數IS_IN_DB可以定義記錄的子集的DAL集對象:

requires=IS_EMPTY_OR(IS_IN_DB(db(db.owner.user_id == auth.user_id), 
           db.owner.id, db.owner._format)) 

這將限制db.owner記錄這些名單與user_id等於當前登錄的用戶(即,auth.user_id)。

如果登錄,您可能還需要與@auth.requires_login()裝飾create()功能,因爲目前用戶只被應用。

+0

再次感謝您安東尼!你能告訴我書中IS_EMPTY_OR的參數是在哪裏定義的(其他所有內容),我非常驚訝,但我完全不瞭解使用情況。謝謝 – PyWebDesign

相關問題