2012-07-10 5 views
2

나는 이것을 달성하기위한 방법을 웹에서 검색해 보았고 여러 가지 해결책을 찾았습니다. 그들 대부분은 지저분한 코드를 가지고 있었고, 모두 단점이있었습니다. 일부 아이디어는 레코드를 기반으로 모든 db 필드의 기본값을 설정하는 것과 관련이 있습니다. 다른 사람들은 appending multiple SQLFORMs에 의해 작업했기 때문에 페이지의 들여 쓰기가 다릅니다 (1 개의 HTML 표가 2 개 있기 때문에).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에 추가 할 수 있습니다, 당신은 SQLFORM.factory을 사용하고 있기 때문에, 당신은 할 수 있어야, 또한 등 validtaors을 field.requires 그리고 유효성을 검사하고 업데이트/삽입합니다. 이 메소드를 사용하여 작성중인 양식에 양식의 유효성을 검사하는 데 필요한 모든 정보가 있는지 확인하십시오. 위의 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 섹션.