Таблица с самоссылкой SQLFORM, отображающая форматированное значение - PullRequest
0 голосов
/ 08 февраля 2019

Возможно ли использование SQLFORM, чтобы рекурсивная таблица извлекала отформатированное значение, как это делается для нерекурсивных таблиц?

Два приведенных ниже примера имеют один и тот же результат: родительское поле, в котором отображается базовое значение идентификатора, а не отформатированное значение имени.

Модель

db.define_table('cat',
                Field('name', type='string', label='Name'),
                Field('parent', 'reference cat', label='Parent'),
                format='%(name)s',
               )

Контроллер

def index(): 
    form=SQLFORM(db.cat)

    if form.process().accepted:
        response.flash = "Updates Accepted"

    return locals()
def manage():
    form=SQLFORM.grid(db.cat, user_signature=False)

    return locals()

1 Ответ

0 голосов
/ 08 февраля 2019

Ответ, предоставленный Энтони в комментарии, в итоге сработал.

Изменение модели на приведенную ниже работает для функции индекса.Мне нужно было IS_NULL_OR в моем случае использования, чтобы позволить значение также отсутствует.

db.define_table('cat',
                Field('name', type='string', label='Name'),
                Field('parent', 'reference cat', label='Parent'),
                format='%(name)s',
               )
db.cat.parent.requires = IS_NULL_OR(IS_IN_DB(db, 'cat.id', '%(name)s'))

Как указал Энтони, атрибут представления также необходим для отображения правильного значения в SQLFORM.grid; приведенная выше модель приводит к отображению переменной id в функции управления.

В функции управления я добавил представление в родительское поле, которое может быть буквальным словом none, если оно пустое, или поиском.

def manage():
    db.cat.parent.represent = lambda id, r: db.cat[id].name if id else 'None'
    form=SQLFORM.grid(db.cat, 
                      user_signature=False)

    return locals()
...