动态更新web2py SQLFORM中的字段

时间:2017-04-04 08:24:51

标签: python web2py

使用接近书中多对多关系示例的示例:

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我想要personthing字段的下拉菜单,因此使用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中的选择如何,都会列出所有这些菜单。

关于如何解决这个问题的任何想法?

1 个答案:

答案 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对象(尽管如此,在这种情况下,这将无济于事,因为你不知道是什么过滤条件将一直在浏览器中进行选择。