为了建立多对多的关系,我制作了一个中间表来组合两个表,这样的表是这样的:
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下拉列表不显示问题1。我发现了类似的问题here
并在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').
TEST3:
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)
但仍未解决。
答案 0 :(得分:1)
如果您希望problem_id下拉列表中的选项根据task_id选择动态更改,那么您将需要使用JavaScript(并且可能会生成Ajax请求以填充下拉列表)。有关可能的解决方案,请参阅this answer。
对于上面的测试,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'