web2py KeyError при использовании CascadingSelect - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь использовать имеющийся 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 Ответ

0 голосов
/ 26 мая 2018

Код для виджета 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петля.В этом случае opt - это Row из таблицы db.bank_branch, а значение str(parent) равно "bank_master" (т. Е. Имя первой таблицы).Значение parent устанавливается в конце цикла for в:

        parent = table

. Конечно, в db.bank_branch нет поля bank_master (вместо этого поле ссылки простопо имени "bank").Таким образом, код виджета ожидает, что имя поля ссылки во второй таблице будет таким же, как и имя первой таблицы.Другими словами, вместо:

    Field('bank', db.bank_master)

он ожидает:

    Field('bank_master', db.bank_master)

, что является общим соглашением при именовании ссылочных полей в web2py.

Итак, вы можетелибо переименуйте ссылочное поле, чтобы оно работало с текущим кодом виджета, либо вы можете изменить код для соответствия альтернативным именам ссылочных полей (возможно, добавив аргумент, позволяющий явно указывать имя).

...