我有一个用于在使用 SQLFORM 生成的表中创建新记录的表单。表的其中一个字段不会直接暴露给用户,而是基于一些其他输入元素的值创建的,这些输入元素本身不属于表的一部分。
如何将其他字段添加到不属于表的 SQLFORM 并且不需要是数据库插入的一部分?在插入数据库之前计算非公开字段的地方在哪里?
(一个假设的例子是在表中有纬度和经度坐标字段,但没有地址字段。在这个例子中,需要在创建表单上的地址字段,可用于地理编码和存储纬度/经度字段中的坐标)
我解决这个问题的方法是使用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
防止动态添加的字段成为插入的一部分。
通过这种方式,我可以向已验证但不属于插入部分的表单添加其他字段。
在 web2py 的最新版本中,您可以缩短它:
form = SQLFORM.factory(
db.table,
Field('my_field_1'),
Field('my_field_2'),
)