【问题标题】:Modify CRUD Form in web2py before sending to view在发送查看之前在 web2py 中修改 CRUD 表单
【发布时间】:2010-08-18 22:01:17
【问题描述】:

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

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

form = crud.create(db.table_name)

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

【问题讨论】:

    标签: python foreign-keys crud web2py auto-generate


    【解决方案1】:

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

    它将显示一个选择框,其中包含外部表中的值: (来自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 字段被表示为一个保管箱。验证器的第三个参数是一个描述 Dropbox 中元素的字符串。在示例中,您希望查看人员 %(name)s 而不是人员 %(id)s。 %(...)s 被每条记录括号中的字段值替换。

    零选项的作用与IS_IN_SET 验证器非常相似。

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

    db.dog.owner.requires = [IS_IN_DB(db, 'person.id', '%(name)s')]
    

    验证器的第一个参数可以是数据库连接或 DAL 集,如 IS_NOT_IN_DB

    有时您需要下拉框(因此您不想使用上面的列表语法),但您想使用其他验证器。为此,IS_IN_DB 验证器采用额外的参数 _and 可以指向应用的其他验证器列表,如果验证值通过 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 和标记

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

    【讨论】:

    • 如果我选择不使用保管箱,有没有办法让文本字段自动将新条目插入外部表?
    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    相关资源
    最近更新 更多