2

我有一个用于在使用 SQLFORM 生成的表中创建新记录的表单。表的其中一个字段不会直接暴露给用户,而是基于一些其他输入元素的值创建的,这些输入元素本身不属于表的一部分。

如何将其他字段添加到不属于表的 SQLFORM 并且不需要是数据库插入的一部分?在插入数据库之前计算非公开字段的地方在哪里?

(一个假设的例子是在表中有纬度和经度坐标字段,但没有地址字段。在这个例子中,需要在创建表单上的地址字段,可用于地理编码和存储纬度/经度字段中的坐标)

4

2 回答 2

2

我解决这个问题的方法是使用SQLFORM.factory而不是SQLFORM.

1.我提取了我表上定义的字段

fields = [field for field in db.customer]

2.附加我想要的新字段

fields += [
    Field('customer_type','string', label=T('Customer Type'),
         requires=IS_IN_SET(customer_types, zero=None, sort=False)),
    Field('another_field','string', label=T('Another Field')),
    ]

3.使用SQLFORM.factory生成表单

form = SQLFORM.factory(
    *fields,
    formstyle='bootstrap',
    _class='customer form-horizontal',
    table_name='customer'
    )

* 注意前面的星号fields是必须的

4. 仍在使用form.process().accepted,但随后计算出我需要的内容,然后手动处理数据库插入

if form.process().accepted:
    ...
    form.vars.some_nonwritable_field = calculate_complicated_value()
    db.customer.insert(**db.customer._filter_fields(form.vars))
    ...

_filter_fields防止动态添加的字段成为插入的一部分。

通过这种方式,我可以向已验证但不属于插入部分的表单添加其他字段。

于 2013-11-05T03:10:37.420 回答
0

在 web2py 的最新版本中,您可以缩短它:

form = SQLFORM.factory(
    db.table,

    Field('my_field_1'),
    Field('my_field_2'),
)
于 2017-10-26T15:03:17.807 回答