web2py - 下拉菜单

时间:2012-04-30 17:10:24

标签: database drop-down-menu web2py

我正在尝试为用户提供一个下拉菜单来选择数据库表。我在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值调用另一个控制器函数。 如果您有任何建议我可以如何修改它以获得非常赞赏的用户选择值。谢谢。

1 个答案:

答案 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.tablesdb连接对象上定义的所有表的列表 - 它在视图中的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提交,因此不会导致整页重新加载。