我需要一些帮助才能让一个小部件在web2py应用程序中正常工作。 顺便说一句,一旦纠正,我认为它可能对其他用户有用......
我构建了一个SELECT小部件来公开区域及其子区域('departement'),以便用户可以选择。 例如:区域A分为部门11和部门12,依此类推。 用户可以选择区域或特定部门(子区域)。
小部件正常工作,但提交时,表单返回错误: form.errors:“r_name:无数据”。 下面是一个显示问题的工作示例。
请帮助我让这个小部件正常工作而不返回错误。既然我不明白什么是错的...... 非常感谢您的帮助。 非常感谢提前。 对不起格式化,但这是我第一次在这里发帖...;)
多米尼克
在模型中:
db.define_table('region',
Field('r_name', 'string', length=250, required=True)
)
db.define_table('departement',
Field('d_name', 'string', length=250, required=True),
Field('d_code', 'string', length=3, required=True),
Field('d_region', db.region)
)
db.define_table('region',
Field('r_name', 'string', length=250, required=True)
)
db.define_table('departement',
Field('d_name', 'string', length=250, required=True),
Field('d_code', 'string', length=3, required=True),
Field('d_region', db.region)
)
def region_widget(f,v,_class= "options"):
"""
Widget that shows regions and departements in a SELECT.
Can be used with SQLFORM and SQLFORM.factory
Usage:
db.region.r_name.widget = region_dptt_select_widget
"""
region_dptt = db(db.region.id==db.departement.d_region)\
.select(db.region.r_name, db.region.id, db.departement.d_name, db.departement.d_code, db.departement.id, \
orderby=db.region.r_name, cache=(cache.ram,6))
def prepare_select(rows):
"""
Creates a list of tuples to be used in the SELECT helper:
['Region A', OPTGROUP('SubRegion 1','SubRegion 2', 'SubRegion 3'),
'Region B', OPTGROUP('SubRegion 4','SubRegion 5', 'SubRegion 6')]
"""
l_r=[]
for row in rows:
r = row.region.r_name
if row.region.r_name not in l_r:
l_r.append(row.region.r_name)
interm_list=[]
for reg in l_r:
l_sr=[]
for row in rows:
if reg == row.region.r_name:
reg_id = row.region.id
dep = row.departement.d_code + ' ' + row.departement.d_name
dep_id = row.departement.id
l_sr.append(OPTION(dep,_value=row.departement.d_code))
option_reg = OPTION(reg, _value= 'R'+str(reg_id))
interm_list.append((option_reg,l_sr))
res=[]
for reg, l_sr in interm_list:
res.append(reg)
res.append(OPTGROUP(*l_sr))
return res
return SELECT(*prepare_select(region_dptt),
**dict(_name='region_to_search', _value=v, _id='region_to_search', _type = 'string', _class="options"))
在控制器中:
def test():
db.region.r_name.widget = region_widget
fields=['r_name']
labels = {'r_name':T('')}
form= SQLFORM(db.region, fields = fields, labels = labels)
a=None
if form.accepts(request.vars, session, formname='test_form', dbio=False):
a = form.vars
elif form.errors:
a = form.errors
return dict(form=form, a = a)
def insertions():# TO RUN one time to fill regions and departments in the db
db.region.insert(r_name="Region A")
db.region.insert(r_name="Region B")
db.departement.insert(d_name="SubRegion 1", d_code="11", d_region=1)
db.departement.insert(d_name="SubRegion 2", d_code="12", d_region=1)
db.departement.insert(d_name="SubRegion 3", d_code="21", d_region=2)
db.departement.insert(d_name="SubRegion 4", d_code="22", d_region=2)
db.departement.insert(d_name="SubRegion 5", d_code="25", d_region=2)
db.departement.insert(d_name="SubRegion 6", d_code="26", d_region=2)
答案 0 :(得分:1)
您的窗口小部件设置_name='region_to_search'
,但SQLFORM期望窗体输入字段名称(因此request.vars
中的关联变量)与用于生成的db表中的字段名称相同表格(即'r_name')。因此,请尝试将小部件代码更改为_name='r_name'
。