0

为了建立多对多关系,我制作了一个中间表来组合两个表,这些表如下:

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)假设表中已经存在一条记录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

如果您希望 question_id 下拉列表中的选项根据 task_id 选择动态更改,那么您将需要使用 JavaScript(并且可能会发出 Ajax 请求来填充下拉列表)。有关可能的解决方案,请参阅此答案

至于您上面的测试,test1 应该进行正确的验证,但只有在提交表单之后(即,表单将允许选择 task_id 和 issue_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 回答