2014-01-23 3 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 설정 객체가 될 수 있습니다, 감사 : 그와 같은 user_id으로 사람들에게 db.owner 레코드 목록을 제한합니다

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

현재 로그인 한 사용자의 이름 (예 : auth.user_id). 현재 사용자 만 응용 프로그램에 알려진 이후에 로그인 한 경우

는 또한, @auth.requires_login()으로 create() 기능을 장식 할 수 있습니다.

+0

다시 안토니 감사합니다! 책에서 IS_EMPTY_OR의 정의가 정의 된 곳 (그리고 그 밖의 모든 것)이 어디 있는지 보여 줄 수 있습니까? 상당히 놀랍지 만 사용법을 완전히 이해하지 못합니다. 고맙습니다 – PyWebDesign

관련 문제