不可写字段上的智能网格验证

问题描述 投票:1回答:1

我有两个链接表(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. 这样智能网格将显示所选car_make的格式化值。
  2. 由于用户选择了car_make记录,因此不需要更新它。

不幸的是,似乎将writable属性设置为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
                     )
web2py
1个回答
0
投票

您可以从URL获取car_model记录的ID,并使用它来获取关联的car_make ID,以构建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记录。

© www.soinside.com 2019 - 2024. All rights reserved.