2012-07-10 65 views
2

我在網絡上搜索了一種方法來實現這一點,並找到了多種解決方案。他們中的大多數都有混亂的代碼,都是缺點。一些想法涉及根據記錄設置所有數據庫字段的默認值。其他人則通過appending multiple SQLFORMs工作,這導致了頁面縮進的差異(因爲它是1個表格中的2個HTML表格)。Web2py - 多個表格只讀表格

我正在尋找一種基於兩個表上的連接提供基於記錄的只讀表示的緊湊和優雅的方式。當然,必須有一些簡單的方法來實現這個目標,對嗎? Web2py書僅包含insert-form的示例。這是我尋找的這種整潔的解決方案。

未來我可能需要多表格形式來提供更新功能,但現在我會很高興,如果我可以得到一個簡單的只讀格式的記錄。

我將不勝感激任何建議。

回答

2

這似乎爲我工作:

def test(): 
    fields = [db.tableA[field] for field in db.tableA.keys() \ 
     if type(db.tableA[field]) == type(db.tableA.some_field)] 
    fields += [db.tableB[field] for field in db.tableB.keys() \ 
     if type(db.tableB[field]) == type(db.tableB.some_field)] 


    ff = [] 
    for field in fields: 
    ff.append(Field(field.name, field.type)) 

    form = SQLFORM.factory(*ff, readonly=True) 

    return dict(form=form) 

你可以在field.required增加,field.requires validtaors等,並且還,因爲你正在使用SQLFORM.factory,你應該能夠驗證它並更新/插入。只要確保使用此方法構建的表單包含驗證表單以進行更新的所有必要信息 - 我相信您可以將它們輕鬆添加到上面的Field實例化中。

編輯:哦,是的,你需要獲得有關記錄的值預填充基於記錄ID(形式定義後)的形式......也只是意識到,而不是這些列表理解,你可以只使用SQLFORM.factory並提供兩個表:

def test(): 
    form = SQLFORM.factory(db.tableA, db.tableB, readonly=True) 

    record = ... (query for your record, probably based on an id in request.args(0)) 
    for field in record.keys(): 
    if (*test if this really is a field*): 
     form.vars[field] = record[field] 

    return dict(form=form) 

一些調整,將必要的,因爲我只爲預人羣提供的僞代碼......但看看:http://web2py.com/books/default/chapter/29/7#Pre-populating-the-form和SQLFORM/SQLFORM.factory部分。