Я пытался установить свойство 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')