我似乎无法找到修改通过以下方式创建的表单的方法:
from gluon.tools import Crud
crud = Crud(globals(), db)
form = crud.create(db.table_name)
由于我在表中使用外键,因此自动生成的表单只允许一个整数(表示外部主键),但我想要做的是输入外部数据字段所需的任何数据类型(而不仅仅是标识符)。是否有一种简单的方法可以告诉 create()函数使用外表的数据类型而不是主表的数据类型(这是自动递增的主键)?
答案 0 :(得分:3)
您可以使用数据库验证器。
它将显示一个包含来自外表的值的选择框: (来自http://web2py.com/book/default/chapter/07?search=requires#Database-Validators):
考虑以下表格和要求:
db.define_table('person', Field('name', unique=True))
db.define_table('dog', Field('name'), Field('owner', db.person)
db.dog.owner.requires = IS_IN_DB(db, 'person.id', '%(name)s',
zero=T('choose one'))
它在dog INSERT / UPDATE / DELETE表单的级别强制执行。它要求dog.owner是数据库db中字段person.id中的有效id。由于此验证器,dog.owner字段表示为dropbox。验证器的第三个参数是一个描述保管箱中元素的字符串。在示例中,您希望查看人员%(名称)s而不是人员%(id)s。 %(...)s由每个记录的括号中的字段值替换。
零选项与IS_IN_SET
验证器非常相似。
如果您希望验证字段,但不想要保管箱,则必须将验证器放在列表中。
db.dog.owner.requires = [IS_IN_DB(db, 'person.id', '%(name)s')]
验证器的第一个参数可以是数据库连接或DAL集,如IS_NOT_IN_DB
中所示。
有时您需要下拉框(因此您不想使用上面的列表语法)但是您想要使用其他验证器。为此,IS_IN_DB验证器采用额外的参数_,并且如果验证值通过IS_IN_DB验证,则可以指向应用的其他验证器的列表。例如,验证db中不属于子集的所有狗主:
subset=db(db.person.id>100)
db.dog.owner.requires = IS_IN_DB(db, 'person.id', '%(name)s',
_and=IS_NOT_IN_DB(subset,'person.id'))
IS_IN_DB验证器具有可选属性multiple = False。如果设置为True,则可以在一个字段中存储多个值。该字段应为类型列表:引用,如第6章所述。此处讨论了标记的明确示例。在创建和更新表单中自动处理多个引用,但它们对DAL是透明的。我们强烈建议使用jQuery multiselect插件来渲染多个字段。