使用一个示例接近书中多对多关系示例中的一个示例:
db = DAL("sqlites://storage.sqlite")
db.define_table('persons',
Field('name'))
db.define_table('things',
Field('name'))
db.define_table('ownership',
Field('person', 'reference persons'),
Field('thing', 'reference things'))
我还有一张 table :
db.define_table('usages',
Field('person', 'reference person',requires = IS_IN_DB(db, db.person.id, '%(name)s'),
Field('thing', 'reference thing'),
Field('usage'))
对于表 usages
我想要 person
和 thing
字段的下拉菜单,因此使用 requires ....
.
但是我想让 thing
的下拉菜单根据 person
中的选择进行更改(以限制选择一个人拥有的东西) . 我考虑使用 requires
正如我所做的那样得到下拉菜单,但我不能在 requires = IS_IN_DB(...)
中使用 db.usages.person
,因为没有创建条目,因此它会引发异常 .
我尝试了什么: requires = IS_IN_DB(db, db((db.usages.person == db.persons.id) &(db.persons.id == db.ownership.person) &(db.ownership.person == db.things.name)))
使用 requires = IS_IN_DB(db,db.things.id, '%(name)s')
为我提供了 thing
的下拉菜单,但它列出了所有这些菜单,无论 person
中的选择如何 .
关于如何解决这个问题的任何想法?
1 回答
没有内置的方法来做你想要的 . 您需要使用Javascript来(a)检测何时在
person
字段中进行选择,以及(b)向服务器发出Ajax请求以获取thing
select元素的选项列表 .有关一些示例,请查看web2pyslices网站上的these posts,并查看plugin_lazy_options_widget .
另外,关于你的代码:
请注意,
IS_IN_DB
的第二个参数必须是Field对象或字段名称,而不是DAL Set对象 . 如果你想通过过滤器限制选项集,第一个参数可以是一个Set对象(但是,如上所述,在得知在浏览器中进行选择之前,它会知道过滤器标准是什么) .