不可写字段上的智能网格验证
smartgrid validation on non-writable field
我有两个链接表(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')
在创建智能电网之前,我设置了
db.car_model.company.writable=False
- 以便 smartgrid 将显示所选 car_make 的格式化值。
- 由于用户选择了 car_make 记录,因此他们不需要更新它。
不幸的是,将可写 属性 设置为 False 似乎会破坏 IS_NOT_IN_DB() 验证,因为该字段未包含在表单中,因此 request.vars.company 未设置。
有没有办法将 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
)
您可以从 URL 中获取 car_model
记录的 ID,并使用它来获取关联的 car_make
ID,以便为 [=13= 构建查询]验证者:
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')
请注意,您还可以通过 request.args(-4)
直接从 URL 获取 car_model.company
值,这不太直接,但不需要获取 car_model
从数据库记录。
我有两个链接表(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')
在创建智能电网之前,我设置了
db.car_model.company.writable=False
- 以便 smartgrid 将显示所选 car_make 的格式化值。
- 由于用户选择了 car_make 记录,因此他们不需要更新它。
不幸的是,将可写 属性 设置为 False 似乎会破坏 IS_NOT_IN_DB() 验证,因为该字段未包含在表单中,因此 request.vars.company 未设置。
有没有办法将 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
)
您可以从 URL 中获取 car_model
记录的 ID,并使用它来获取关联的 car_make
ID,以便为 [=13= 构建查询]验证者:
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')
请注意,您还可以通过 request.args(-4)
直接从 URL 获取 car_model.company
值,这不太直接,但不需要获取 car_model
从数据库记录。