Python 在发送到视图之前修改web2py中的CRUD表单

Python 在发送到视图之前修改web2py中的CRUD表单,python,foreign-keys,crud,web2py,auto-generate,Python,Foreign Keys,Crud,Web2py,Auto Generate,我似乎找不到修改通过以下方式创建的表单的方法: from gluon.tools import Crud crud = Crud(globals(), db) form = crud.create(db.table_name) 由于我在表中使用外键,自动生成的表单只允许整数(表示外键主键),但我希望能够输入外键数据字段所需的任何数据类型(而不仅仅是标识符)。有没有一种简单的方法告诉create()函数使用外部表的数据类型而不是主表的数据类型(即自动递增的主键)?您可以使用数据库验证器来验证它

我似乎找不到修改通过以下方式创建的表单的方法:

from gluon.tools import Crud
crud = Crud(globals(), db)

form = crud.create(db.table_name)

由于我在表中使用外键,自动生成的表单只允许整数(表示外键主键),但我希望能够输入外键数据字段所需的任何数据类型(而不仅仅是标识符)。有没有一种简单的方法告诉create()函数使用外部表的数据类型而不是主表的数据类型(即自动递增的主键)?

您可以使用数据库验证器来验证它

它将显示一个选择框,其中包含来自外部表的值: (发件人):

_在_DB中吗 考虑以下表格和要求:

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.owner必须是数据库db中person.id字段中的有效id。由于该验证器,dog.owner字段表示为dropbox。验证器的第三个参数是描述dropbox中元素的字符串。在本例中,您希望看到的是人员%(姓名)s,而不是人员%(id)s.%(…)s被每个记录的括号中的字段值替换

零选项的工作原理与
IS_IN_SET
验证器非常相似

如果希望验证字段,但不希望使用dropbox,则必须将验证器放入列表中

db.dog.owner.requires = [IS_IN_DB(db, 'person.id', '%(name)s')]
验证器的第一个参数可以是数据库连接或DAL集,如
IS\u NOT \u in \u DB
中所示

有时,您需要下拉框(因此您不希望使用上面的列表语法),但您希望使用其他验证器。为此,IS_IN_DB验证程序接受一个额外的参数,如果验证值通过IS_IN_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插件来呈现多个字段。

如果我选择不使用dropbox,有没有办法让文本字段自动将新条目插入到外部表中?