0

多対多のリレーションシップを作成するために、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)

しかし、それはまだ解決されていません。

4

1 に答える 1

1

task_id の選択に基づいて、problem_id ドロップダウンの選択肢を動的に変更する場合は、JavaScript を使用する必要があります (ドロップダウンに入力するために Ajax リクエストを行う可能性があります)。考えられる解決策については、この回答を参照してください。

上記のテストと同様に、test1 は適切な検証を行う必要がありますが、それはフォームが送信された後に限られます (つまり、フォームでは task_id と problem_id の任意の組み合わせを選択できますが、重複した組み合わせが送信された場合はエラーが報告されます)。 )。

test3 はそのままでは機能しません。これは、queryオブジェクトがデータベースからの選択を実際に行わずにデータベース クエリを指定するだけだからです。.select()代わりに、メソッド、またはより簡単にメソッドを呼び出す必要があります.count()

if db((db.belong.task_id == a) & (db.belong.problem_id == b)).count():
    form.errors.a= 'the record has existed'
于 2014-08-18T13:03:50.660 に答える