使用 CascadingSelect 时出现 web2py KeyError

web2py KeyError on using CascadingSelect

我正在尝试使用可用的 CascadingSelect here,但得到 <type 'exceptions.KeyError'>。我的模型如下:

# -*- coding: utf-8 -*-
db.define_table('bank_master',
            Field('name'),
            format='%(name)s'
            )

db.define_table('bank_branch',
            Field('bank', db.bank_master),
            Field('name'),
            format='%(name)s'
            )
db.define_table('case_master',
            Field('case_number'),
            Field('bank_branch', db.bank_branch)
            )

if db(db.bank_master.id>0).count() == 0:
    db.bank_master.truncate()
    db.bank_branch.truncate()

    db.bank_master.insert(name='State Bank')
    db.bank_master.insert(name='Central Bank')
    db.bank_master.insert(name='Canara Bank')

    db.bank_branch.insert(name='Austin',bank=1)
    db.bank_branch.insert(name='Dallas',bank=1)
    db.bank_branch.insert(name='Chicago',bank=2)
    db.bank_branch.insert(name='Washington',bank=2)
    db.bank_branch.insert(name='Florida',bank=3)
    db.bank_branch.insert(name='Delhi',bank=3)

cascade = CascadingSelect(db.bank_master,db.bank_branch)
db.case_master.bank_branch.widget = cascade.widget

这是控制器:

def index():
    form = SQLFORM(db.case_master)  
    return dict(form=form)

这是视图 index.html:

{{extend 'layout.html'}}
<h1>Test for Cascade</h1>
<h3>{{=form}}</h3>

这是错误单:

Traceback (most recent call last):
File "C:\web2py\gluon\restricted.py", line 219, in restricted
exec(ccode, environment)
File "C:/web2py/applications/cascade_3/controllers/default.py", line 64, in <module>
File "C:\web2py\gluon\globals.py", line 419, in <lambda>
self._caller = lambda f: f()
File "C:/web2py/applications/cascade_3/controllers/default.py", line 9, in index
form = SQLFORM(db.case_master)
File "C:\web2py\gluon\sqlhtml.py", line 1505, in __init__
inp = field.widget(field, default)
File "C:/web2py/applications/cascade_3/models/cascade_widget.py", line 26, in widget
for opt in options]
File "C:\web2py\gluon\packages\dal\pydal\objects.py", line 96, in __getitem__
raise KeyError
KeyError

mfreeze 使用的模型通过添加虚拟字段进行调整时,CascadingSelect 小部件可以完美运行,但不知何故,当我如上所述使用自己的模型时,KeyError 突然出现。任何人都可以帮助定位我的错误吗?

CascadingSelect 小部件的 code 包括以下内容:

        opts = [OPTION(format % opt,_value=opt.id,
                             _parent=opt[str(parent)] if parent else '0') \
                              for opt in options]

KeyErroropt[str(parent)] 第二次通过 for 循环的结果。在这种情况下,optdb.bank_branch table 的 Row,而 str(parent) 的值是 "bank_master"(即名称第一个 table)。 parent 的值设置在 for 循环末尾附近:

        parent = table

当然,db.bank_branch中没有bank_master字段(相反,引用字段只是简单地命名为"bank")。因此,小部件代码期望第二个 table 中引用字段的名称与第一个 table 中的名称相同。换句话说,而不是:

    Field('bank', db.bank_master)

它期望:

    Field('bank_master', db.bank_master)

这是在 web2py 中命名引用字段时的通用约定。

因此,您可以重命名引用字段,使其与当前的小部件代码一起使用,或者您可以修改代码以适应其他引用字段名称(可能通过添加一个允许您明确指定名称的参数)。