使用 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]
KeyError
是 opt[str(parent)]
第二次通过 for
循环的结果。在这种情况下,opt
是 db.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 中命名引用字段时的通用约定。
因此,您可以重命名引用字段,使其与当前的小部件代码一起使用,或者您可以修改代码以适应其他引用字段名称(可能通过添加一个允许您明确指定名称的参数)。
我正在尝试使用可用的 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]
KeyError
是 opt[str(parent)]
第二次通过 for
循环的结果。在这种情况下,opt
是 db.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 中命名引用字段时的通用约定。
因此,您可以重命名引用字段,使其与当前的小部件代码一起使用,或者您可以修改代码以适应其他引用字段名称(可能通过添加一个允许您明确指定名称的参数)。