Вы можете использовать для этого валидаторы базы данных.
Появится поле выбора со значениями из внешней таблицы: (из http://web2py.com/book/default/chapter/07?search=requires#Database-Validators):
IS_IN_DB
Рассмотримследующие таблицы и требования:
db.define_table('person', Field('name', unique=True))
db.define_table('dog', Field('name'), Field('owner', db.person)
db.dog.owner.requires = IS_IN_DB(db, 'person.id', '%(name)s',
zero=T('choose one'))
Применяется на уровне форм INSERT / UPDATE / DELETE для собак. Требуется, чтобы dog.owner был действительным идентификатором в поле person.id в базе данных dbИз-за этого валидатора поле dog.owner представляется в виде раскрывающегося списка. Третий аргумент валидатора представляет собой строку, описывающую элементы в раскрывающемся списке. В примере вы хотите видеть человека% (имя) вместоперсона% (id) s.% (...) s заменяется значением поля в скобках для каждой записи.
Параметр нуля работает так же, как для валидатора IS_IN_SET
.
Если вы хотите, чтобы поле было проверено, но вы не хотите использовать раскрывающийся список, вы должны поместить валидатор в список.
db.dog.owner.requires = [IS_IN_DB(db, 'person.id', '%(name)s')]
Первым аргументом валидатора может быть соединение с базой данных илинабор DAL, как в IS_NOT_IN_DB
.
Иногда вам требуется раскрывающееся окно (поэтому вы не хотите использовать синтаксис списка выше), но хотите использовать дополнительные валидаторы.Для этого валидатор IS_IN_DB принимает дополнительный аргумент _, который может указывать на список других применяемых валидаторов, если проверенное значение проходит валидацию IS_IN_DB.Например, чтобы проверить всех владельцев собак в db, которые не входят в подмножество:
subset=db(db.person.id>100)
db.dog.owner.requires = IS_IN_DB(db, 'person.id', '%(name)s',
_and=IS_NOT_IN_DB(subset,'person.id'))
IS_IN_DB и тегирование
Валидатор IS_IN_DB имеет необязательный атрибут множественный = False.Если установлено значение True, несколько значений могут быть сохранены в одном поле.Это поле должно быть типа list: ссылка, как описано в главе 6. Там обсуждается явный пример тегирования.несколько ссылок обрабатываются автоматически в формах создания и обновления, но они прозрачны для DAL.Мы настоятельно рекомендуем использовать плагин множественного выбора jQuery для рендеринга нескольких полей.