我有一个用于在使用SQLFORM生成的表中创建新记录的表单。表中的一个字段不会直接暴露给用户,而是基于其他一些输入元素的值创建,这些输入元素本身不属于表格。
如何向不属于表的SQLFORM添加其他字段,而不需要成为数据库插入的一部分?在插入数据库之前,计算非暴露字段的位置在哪里?
(一个假设的例子是在表中有纬度和经度坐标字段但没有地址字段。在这个例子中,需要创建表单上的地址字段,可用于在lat / lng字段中对地理编码和存储坐标)< / p>
答案 0 :(得分: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
可防止动态添加的字段成为插入的一部分。
这样我就可以在已经验证但不是插入的一部分的表单中添加其他字段。
答案 1 :(得分:0)
在最新版本的web2py中,您可以缩短范围:
form = SQLFORM.factory(
db.table,
Field('my_field_1'),
Field('my_field_2'),
)