bugfix> web2py > 投稿

CascadingSelectを使用しようとしていますここに、しかし <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

CascadingSelectウィジェットは、使用するモデルがmfreeze ダミーフィールドを追加することで調整されますが、どういうわけか上記のように自分のモデルを使用すると、 KeyError 切り取ります。誰でも私のエラーを見つけるのに役立ちますか?

回答 1 件
  • CascadingSelect のコード  ウィジェットには次のものが含まれます。

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

    ザ・ KeyError   opt[str(parent)] の結果   for の2回目のパスで  ループ。その場合、 opt  は Row です   db.bank_branch から  テーブル、および str(parent) の値  は "bank_master" です  (つまり、最初のテーブルの名前)。 parent の値   for の終わり近くに設定されます  ループ:

           parent = table
    
    

    もちろん、 bank_master はありません   db.bank_branch のフィールド  (代わりに、参照フィールドは単に "bank" という名前です )。そのため、ウィジェットコードでは、2番目のテーブルの参照フィールドの名前が最初のテーブルの名前と同じであると想定しています。つまり、次の代わりに:

       Field('bank', db.bank_master)
    
    

    それは期待しています:

       Field('bank_master', db.bank_master)
    
    

    これは、web2pyで参照フィールドに名前を付けるときの一般的な規則です。

    したがって、現在のウィジェットコードで動作するように参照フィールドの名前を変更するか、代替参照フィールド名に対応するようにコードを変更できます(おそらく、名前を明示的に指定できる引数を追加することによって)。

あなたの答え