Как я могу исправить KeyError при использовании require в web2py определении поля таблицы с типом ссылки? - PullRequest
0 голосов
/ 16 ноября 2018

Я пытался установить свойство require в таблице в приложении web2py, которое взял на себя, чтобы валидатор ограничил значения раскрывающегося списка в форме подмножеством учетных записей пользователей.Я прочитал пару постов на форумах Google, например, https://groups.google.com/forum/#!topic/web2py/n2c3xP6EQ8I,, и здесь предлагаю, что это можно сделать, и я следил за тем, что у меня теперь есть следующее определение поля в таблице:

Field('supervisor', type='reference auth_user', label=T('Supervisor'), requires=IS_EMPTY_OR(IS_IN_DB(db((db.auth_user.is_active == True) & (db.auth_user.id == db.auth_membership.user_id) & (db.auth_membership.group_id != 5)), db.auth_user.id, db.auth_user._format))),

Когда я запускаю приложение, но получаю сообщение об ошибке:

<class 'KeyError'> 'id'

Я пробовал другие предложения, такие как добавление:

represent=lambda id, r: '%(first_name)s %(last_name)s' % db.auth_user(id)

в определение поля, но оно приходитс той же ошибкой.

Я пытался разбить запрос на две части и использовать параметр _and с IS_NOT_IN_DB, поскольку казалось, что это может дать аналогичный эффект:

Field('supervisor', type='reference auth_user', label=T('Supervisor'), requires=IS_EMPTY_OR(IS_IN_DB(db(db.auth_user.is_active == True), db.auth_user.id, db.auth_user._format, _and=IS_NOT_IN_DB(db(db.auth_membership.group_id != 5), db.auth_membership.user_id)))),

Хотя вышеизложенное не вызывает ошибку, оно также не исключает нежелательных пользователей в раскрывающемся списке.Единственная мысль, которая у меня возникла, заключалась в том, что это может быть из-за того, что приложение использует crud для генерации форм вместо явного использования SQLFORM, и в сообщении, которое я видел, упоминалось, что Crud был по существу отброшен в пользу SQLFORM ...

Для справки моя версия web2py: 2.17.2, загруженная из источника.

Кто-нибудь знает, как можно исправить определение поля, чтобы эта работа работала?

ОБНОВЛЕНО (2018/11/ 200):

Извините, вот трассировка:

Трассировка

    Traceback (most recent call last):
File "C:\Users\Ben\python\web2py\gluon\restricted.py", line 219, in restricted
    exec(ccode, environment)
File "C:/Users/Ben/python/web2py/applications/lycomms/controllers/work_order.py", line 412, in <module>
File "C:\Users\Ben\python\web2py\gluon\globals.py", line 421, in <lambda>
    self._caller = lambda f: f()
File "C:\Users\Ben\python\web2py\gluon\tools.py", line 3867, in f
    return action(*a, **b)
File "C:/Users/Ben/python/web2py/applications/lycomms/controllers/work_order.py", line 187, in add
    form = crud.create(db.work_order)
File "C:\Users\Ben\python\web2py\gluon\tools.py", line 4374, in create
    **attributes
File "C:\Users\Ben\python\web2py\gluon\tools.py", line 4296, in update
    **attributes  # contains hidden
File "C:\Users\Ben\python\web2py\gluon\sqlhtml.py", line 1523, in __init__
    inp = self.widgets.options.widget(field, default)
File "C:\Users\Ben\python\web2py\gluon\sqlhtml.py", line 325, in widget
    options = requires[0].options()
File "C:\Users\Ben\python\web2py\gluon\validators.py", line 2795, in _options
    options = self.other.options(*args, **kwargs)
File "C:\Users\Ben\python\web2py\gluon\validators.py", line 601, in options
    self.build_set()
File "C:\Users\Ben\python\web2py\gluon\validators.py", line 594, in build_set
    self.theset = [str(r[self.kfield]) for r in records]
File "C:\Users\Ben\python\web2py\gluon\validators.py", line 594, in <listcomp>
    self.theset = [str(r[self.kfield]) for r in records]
File "C:\Users\Ben\python\web2py\gluon\packages\dal\pydal\objects.py", line 94, in __getitem__
    raise KeyError(key)
KeyError: 'id'

Список аргументов функции

(self=<Row {'auth_user': {'id': 39, 'first_name': 'Ben...ship': {'id': 83, 'user_id': 39, 'group_id': 2}}>, k='id')
...