多対多のリレーションシップを作成するために、2 つのテーブルを結合する中間テーブルを作成します。テーブルは次のようになります。
db.define_table('problem',
Field('task_id','reference task'),
Field('title','string',unique=True,length=255))
db.define_table('task',
Field('title','string',unique=True,length=255),
Field('course_id','reference courses'))
db.define_table('belong',
Field('task_id','reference task'),
Field('problem_id','reference problem')
)
db.belong.task_id.requires=IS_IN_DB(db,'task.id','%(title)s')
db.belong.problem_id.requires=IS_IN_DB(db,'problem.id','%(title)s')
SQLFORMを使用してテーブルに挿入しbelongます。重複したタスクと問題がないようにしたいです。(1,task1,problem1)table に既に存在するようなレコードがあると仮定belongし、SQLFORM で task1 を選択した場合、problem_id ドロップダウン リストに problem1 が表示されないようにする方法を教えてください。ここで同様の質問を見つけ
、次のようなテストを行いますdb.py:
test1:
db.belong.problem_id.requires=IS_NOT_IN_DB(db(db.belong.task_id==request.vars.task_id),'belong.problem_id').
test2:
db.belong.problem_id.requires=IS_NOT_IN_DB(db(db.belong.task_id==request.vars.task_id),'problem.id','%(title)s').
テスト3:
def my_form_processing(form):
a = form.vars.task_id
b=form.vars.problem_id
query=(db.belong.task_id==a)&(db.belong.problem_id==b)
if query :
form.errors.a= 'the record has existed'
def assignproblem():
form=SQLFORM(db.belong)
if form.process(onvalidation=my_form_processing).accepted:
response.flash='form accepted'
elif form.errors:
response.flash='form has errors'
else:
response.flash='please fill out the form'
return dict(form=form)
しかし、それはまだ解決されていません。