1

我正在尝试为用户提供一个下拉菜单来选择数据库表。我在 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”值。我不一定想从数据库中检索表值。我可以定义一个包含可用表的列表,下拉菜单可以从该列表中提取表名。到目前为止,我只发现 IS_IN_DB 可以自动创建下拉列表和 PluginDropdown() 但这不符合我的目的。如果有人能指导我以正确的方式处理这项任务,我将非常感激。

问候。


更新:

在安东尼的建议之后,我尝试了以下操作,因为我对 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}}

但我不确定如何将用户选择的值分配给参数,然后使用该参数值调用另一个控制器函数。如果您有任何建议,我可以如何修改它以获得用户选择的值,非常感谢。谢谢你。

4

1 回答 1

1

您可以创建一个<select>列出所有表的元素,然后通过 Ajax将与所选表关联的表单作为web2py 组件加载。在主页面的视图中(例如,/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()在视图中的帮助器中用于生成<select>所有表的列表。视图中的脚本注册了一个 jQuery 事件处理程序,每当从下拉列表中选择不同的表时就会触发该事件处理程序。处理程序调用该web2py_component()函数(位于 /static/js/web2py.js 中),该函数通过 Ajax 将表单组件加载到 id="form" 的 div 中。它将所选表的值附加到 URL。

在控制器中,该form()函数检查 request.args(0) 中的 db 表名。然后设置response.generic_patterns为允许“generic.load”视图(默认情况下,通用视图仅对本地请求启用)。或者,您可以定义自己的“form.load”视图,甚至使用不同的扩展名(例如,“form.html”)。

因为表单是作为 web2py Ajax 组件加载的,所以表单提交也会被捕获并通过 Ajax 提交,因此不会导致整个页面重新加载。

于 2012-04-30T18:42:29.553 回答