使用接近书中多对多关系示例的示例:
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'))
我还有一张表:
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
来获取下拉菜单,但我不能在db.usages.person
中使用requires = IS_IN_DB(...)
,因为该条目未创建,因此会引发异常。
我尝试了什么:
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
中的选择如何,都会列出所有这些菜单。
关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
没有内置的方法可以做你想要的。您需要使用Javascript来(a)检测何时在person
字段中进行选择,以及(b)向服务器发出Ajax请求以获取thing
选择的选项列表元件。
对于某些示例,请查看web2pyslices网站上的these posts,并查看plugin_lazy_options_widget
。
另外,关于你的代码:
requires = IS_IN_DB(db, db((db.usages.person == db.persons.id) &(db.persons.id == db.ownership.person) &(db.ownership.person == db.things.name)))
请注意,IS_IN_DB
的第二个参数必须是Field对象或字段名称,而不是DAL Set对象。如果你想通过一个过滤器来限制选项集,那么第一个参数可以是一个Set对象(尽管如此,在这种情况下,这将无济于事,因为你不知道是什么过滤条件将一直在浏览器中进行选择。