我正在尝试为用户提供一个下拉菜单来选择数据库表。我在db.py中定义了几个表,我希望用户从下拉菜单中选择一个特定的表并插入条目。现在我使用SQLFORM:
def index():
form=SQLFORM(db.selectedtable) #want to change the table name#
if form.process().accepted:
response.flash = 'form accepted'
elif form.errors:
response.flash = 'form has errors'
else:
response.flash = 'please fill out the form'
return dict(form=form)
我需要用户从下拉列表中选择“selectedtable”值,该列表显示数据库中的所有可用表。我不一定想从DB中检索表值。我可以定义包含可用表的列表,下拉菜单可以从该列表中提取表名。 到目前为止,我只发现IS_IN_DB自动创建一个下拉列表和PluginDropdown(),但这不符合我的目的。如果soemebody可以指导我正确处理这项任务的方式,那我真的很感激。
问候。
更新
在Anthony的建议之后,我尝试了以下内容,因为我对JS并不熟悉。
{{extend 'layout.html'}}
{{select='NONE'}}
<form>
<select>
{{for item in TOOLS:}}
<option value="{{select=item}}">{{=item}}</option>{{pass}}
</select>
<input type="submit" value="Go!"/>
</form>
<h2>Input form</h2>
{{=form}}
<h2>{{=select}}</h2>
您可能会发现这不能正常工作。我试图做的是让用户选择值来“选择”变量。但它不起作用。它总是获取ITEMS中的最后一个元素(此列表在db.py中定义)。我的下一个选择是调用另一个控制器函数,将用户选择的值作为参数传递。然后它可以使用传递的值准备表单并发送到视图以显示
<h2>Input form</h2>
{{=form}}
但我不确定如何将用户选择的值分配给参数,然后使用该arugument值调用另一个控制器函数。 如果您有任何建议我可以如何修改它以获得非常赞赏的用户选择值。谢谢。
答案 0 :(得分:1)
您可以创建列出所有表的<select>
元素,然后通过Ajax将与所选表关联的表单加载为web2py component。在主页面的视图中(例如/views/default/index.html):
<script>
jQuery(function() {
jQuery('#table').change(function() {
web2py_component("{{=URL('default', 'form.load')}}" + "/" +
jQuery(this).val(), target='form')
})
})
</script>
{{=SELECT('Select a table', *db.tables, _id='table')}}
<div id="form"></div>
在控制器中(例如,default.py):
def form():
if request.args(0) in db.tables:
response.generic_patterns = ['load']
return dict(form=SQLFORM(db[request.args(0)]).process())
else:
raise HTTP(404)
注意,db.tables
是db
连接对象上定义的所有表的列表 - 它在视图中的SELECT()
帮助器中用于生成{{1}所有表的列表。视图中的脚本注册了一个jQuery事件处理程序,只要从下拉列表中选择了不同的表,就会触发该处理程序。处理程序调用{{1}}函数(位于/static/js/web2py.js中),它通过Ajax将表单组件加载到id =“form”的div中。它将所选表的值附加到URL。
在控制器中,<select>
函数检查request.args(0)中的db表名。然后设置web2py_component()
,以便允许“generic.load”视图(默认情况下,通用视图仅对本地请求启用)。或者,您可以定义自己的“form.load”视图,甚至使用不同的扩展名(例如“form.html”)。
因为表单是作为web2py Ajax组件加载的,所以表单提交也将被捕获并通过Ajax提交,因此不会导致整页重新加载。