проверка SmartGrid на недоступном для записи поле - PullRequest
1 голос
/ 19 марта 2019

У меня есть две связанные таблицы (car_make, car_model).

db.define_table('car_make',
            Field('id', type='id', notnull=True),
            Field('name',type='string', notnull=True, unique=True),
            format='%(name)s'
           )
db.define_table('car_model',
            Field('id',type='id', notnull=True),
            Field('company', 'reference car_make', notnull=True),
            Field('name',type='string', notnull=True),
            Field('mfr_year',type='integer', notnull=True)
           )

Я использую валидатор IS_NOT_IN_DB, чтобы гарантировать, что записи car_model уникальны на основе car_make / name / mfr_year.

db.car_model.name.requires=IS_NOT_IN_DB(db((db.car_model.company==request.vars.company) & (db.car_model.mfr_year==request.vars.mfr_year)),'car_model.name')

Перед созданием smartgrid я установил

db.car_model.company.writable=False
  1. , чтобы smartgrid отображал форматированное значение для выбранного car_make.
  2. Посколькупользователь выбрал запись car_make, которую не нужно обновлять.

К сожалению, похоже, что установка свойства writeable в False нарушает проверку IS_NOT_IN_DB (), потому что поле не включается вформа и, как следствие, request.vars.company не устанавливаются.

Есть ли способ использовать smartgrid с полем, недоступным для записи, и при этом применять уникальность для нескольких полей с помощью smartgrid?

Вот мой код для smartgrid

grid = SQLFORM.smartgrid(db.car_make,
                     linked_tables=['car_model'],
                     create=dict(car_make=True, 
                                 car_model=True),
                     deletable=dict(car_make=True, 
                                    car_model=True),
                     editable=dict(car_make=True, 
                                   car_model=True),
                     advanced_search=False,
                     searchable=dict(car_make=True, car_model=False),
                     details=False,
                     csv=False,
                     maxtextlength=100
                     )

1 Ответ

0 голосов
/ 20 марта 2019

Вы можете получить идентификатор записи car_model из URL-адреса и использовать его для получения связанного идентификатора car_make, чтобы построить запрос для валидатора IS_NOT_IN_DB:

if request.args(-2) == 'car_model' and request.args(-1).isdigit():
    car_model = db.car_model(request.args(-1))
    same_company = db.car_model.company == car_model.company
    same_year = db.car_model.mfr_year == request.vars.mfr_year
    query = same_company & same_year
    db.car_model.name.requires = IS_NOT_IN_DB(db(query), 'car_model.name')

Обратите внимание, вы также можете получить значение car_model.company непосредственно из URL-адреса через request.args(-4), что немного менее просто, но не требует извлечения записи car_model из базы данных.

...