python - 在发送查看之前修改 web2py 中的 CRUD 表单

标签 python foreign-keys crud web2py auto-generate

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

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

form = crud.create(db.table_name)

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

最佳答案

您可以使用数据库验证器。

它将显示一个选择框,其中包含外部表中的值: (来自http://web2py.com/book/default/chapter/07?search=requires#Database-Validators):

IS_IN_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'))

它是在狗 INSERT/UPDATE/DELETE 表单级别强制执行的。它要求dog.owner是数据库db中的person.id字段中的有效ID。由于这个验证器,dog.owner 字段被表示为一个保管箱。验证器的第三个参数是一个描述保管箱中元素的字符串。在示例中,您希望查看人员 %(name)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 验证器需要一个额外的参数 _and ,如果验证的值通过了 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 和标记

IS_IN_DB 验证器有一个可选属性 multiple=False。如果设置为 True,则可以在一个字段中存储多个值。该字段应该是 list:reference 类型,如第 6 章中讨论的那样。其中讨论了标记的显式示例。多个引用在创建和更新表单中自动处理,但它们对 DAL 是透明的。我们强烈建议使用 jQuery 多选插件来渲染多个字段。

关于python - 在发送查看之前修改 web2py 中的 CRUD 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3517072/

相关文章:

python3弄乱了终端

mysql - 无法创建约束键

database - 如何在oracle中找到外键的父表?

java - 带有 CRUD 的 Spring 基于 Web 的管理工具

asp.net-mvc - 在数据库上执行读取和创建/更新时使用实体和 DTO

python - 如何使用 pyparsing 解析系统日志消息

python - 更改多级字典值的更多 pythonic 方法

Python Matplotlib Streamplot 提供起点

mysql - SQLSTATE[23000] : Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails error in Laravel 4

NestJSX 从 CrudRequest 对象获取参数