我想知道的是,制作多选列表的唯一方法是在两个表之间有桥表吗?
我有桌子(会员,语言,会员语言) - >每个成员都有一种或多种语言我制作了一个多选长度列表,我选择了更多的语言,它可以正常工作。
但是我想在区域表中做同样的事情,但是这里的成员只有一个区域,所以当我从多选区域列表中选择多个区域时,它会导致错误“值不在数据库中!”,并且当我从区域列表中选择一个值时,它可以正常工作。
我想只有一个区域列表,我可以选择多个区域来生成满足所选区域的报告,我不会将任何选定的区域插入数据库,我只会将它们用于我的查询。 / p>
我该怎么做?
我的代码:
数据库部分
db.define_table("region_tmp",
SQLField("name","string")) db.region_tmp.name.requires = IS_IN_DB(db,'region_tmp.name',multiple=True)
组成部分:
form=SQLFORM(SQLDB(None).define_table('myform',
db.region_tmp.name,,submit_button="Generate Report")
当我从区域列表中选择多个区域时,我的代码输出是多选区域列表表单显示“值不在数据库中!”区域列表下的消息,当我从区域列表中选择一个区域时,它可以正常工作并生成报告。
提前致谢
答案 0 :(得分:0)
如果我理解正确,您希望以多选形式显示所有区域,用于返回所选区域而不修改数据库?
您应首先从数据库中选择所有区域(我想您已经这样做了),然后将它们放在FORM中。例如,如果您的表格regions
包含字段name
:
rows= db().select(db.regions.ALL)
components = [LI(INPUT(_name=i.name, _type="checkbox"), i.name) for i in rows]
return dict(form=FORM(INPUT(_type="submit"),
*components),
_method="post", _action="")
将返回可插入模板的表单。您可以使用除LI之外的其他内容,如P或BR,您还可以添加更好的格式(表格,...),但这只是想法。
这是第一部分。要提取所选信息,您可以在控制器功能中使用它:
def index():
# Prepare the form
rows = db().select(db.regions.ALL)
components = [LI(INPUT(_name=i.name, _type="checkbox"), i.name) for i in rows]
form=FORM(INPUT(_type="submit"),
*components,
_method="post", _action="")
if request.post_vars.get("submit"):
# Check the answer
# ... more code ...
redirect(URL(r=request, f="show", args=request.args))
return dict(form=form)
def show():
# ... more code ...
(你必须在if之后检查条件,我不是100%肯定)。 index()
将在第一次显示表单时调用,第二次在用户单击“提交”按钮时调用。第二次,它应该进入条件,做你需要做的任何事情(检索区域值),并将输出重定向到另一个页面(这里是函数show()
)。
我只是给你一个整体的想法,但你应该真正解决教程和web2py的常见问题,以获得该框架的处理。