web2py中 - 下拉菜单(web2py - Dropdown menu)

2019-10-16 16:17发布

我想有一个下拉菜单供用户选择数据库表。 我已经定义在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()但是,这并不为我的目的。 如果soemebody可以直接给我处理这个任务的正确方法,我会真的很感谢。

问候。


更新:

安东尼的suggession后,我试着用下面的,因为我没那么熟悉的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>

正如你可能会看到,这并不正常工作。 我试图做的是让用户选择值“选择”变量。 但是,这是行不通的。 它总是得到中的项目(这个列表中db.py定义)的最后一个元素。 我的下一个选择是要调用另一个控制器功能,通过用户选择的值作为参数。 然后,它可与传递的值制备的形式,并且发送到一个视图中显示

<h2>Input form</h2>
    {{=form}}

但我不知道我怎么可以将用户选择的值赋给一个参数,然后调用与arugument价值的另一个控制器功能。 如果您有任何建议,我怎么能修改此来获取用户选择的值这就是非常赞赏。 谢谢。

Answer 1:

可以创建一个<select>列出所有的表元素,然后加载与所选择的表中,作为相关联的形式的web2py部件通过Ajax。 在主网页(例如,/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 =“形式”在div。 它追加选择的表到URL值。

在控制器中,所述form()在request.args中为db表名称功能检查(0)。 然后设置response.generic_patterns所以“generic.load”的观点将被允许(默认情况下,通用视图只为本地请求启用)。 或者,你可以定义自己的“form.load”的观点,甚至可以使用不同的扩展名(例如,“form.html”)。

由于形式加载为web2py的Ajax组件,表单提交将被捕获并通过Ajax提交的为好,这样就不会导致重新加载整个页面。



文章来源: web2py - Dropdown menu