Измените форму CRUD в web2py перед отправкой для просмотра - PullRequest
1 голос
/ 19 августа 2010

Я не могу найти способ изменить форму, которая была создана с помощью:

from gluon.tools import Crud
crud = Crud(globals(), db)

form = crud.create(db.table_name)

Поскольку я использую внешние ключи в своей таблице, автоматически сгенерированная форма допускает только целое число (котороепредставляет внешний первичный ключ), но я хочу иметь возможность вводить любой тип данных, который требуется для внешнего поля данных (а не просто идентификатор).Есть ли простой способ указать функции create () использовать тип данных внешней таблицы, а не тип данных первичной таблицы (то есть первичный ключ с автоинкрементным расширением)?

1 Ответ

3 голосов
/ 19 августа 2010

Вы можете использовать для этого валидаторы базы данных.

Появится поле выбора со значениями из внешней таблицы: (из 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 для рендеринга нескольких полей.

...