У меня есть две связанные таблицы (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
- , чтобы smartgrid отображал форматированное значение для выбранного car_make.
- Посколькупользователь выбрал запись 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
)