首页 文章

动态更新web2py SQLFORM中的字段

提问于
浏览
0

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

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 我想要 personthing 字段的下拉菜单,因此使用 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 回答

  • 1

    没有内置的方法来做你想要的 . 您需要使用Javascript来(a)检测何时在 person 字段中进行选择,以及(b)向服务器发出Ajax请求以获取 thing select元素的选项列表 .

    有关一些示例,请查看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对象(但是,如上所述,在得知在浏览器中进行选择之前,它会知道过滤器标准是什么) .

相关问题