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)

DB で使用可能なすべてのテーブルを表示するドロップダウン リストから、ユーザーが「selectedtable」値を選択する必要があります。DB からテーブルの値を取得する必要はありません。利用可能なテーブルのリストを定義しても問題ありません。ドロップダウン メニューは、そのリストからテーブル名を取得できます。これまでのところ、ドロップダウンと PluginDropdown() を自動的に作成する IS_IN_DB しか見つかりませんでしたが、それは私の目的を果たしません。誰かがこのタスクを処理する適切な方法に私を導くことができれば、私は本当に感謝しています.

よろしく。


アップデート:

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}}

しかし、ユーザーが選択した値を引数に割り当てて、その引数値で別のコントローラー関数を呼び出す方法がわかりません。ユーザーが選択した値を取得するためにこれを変更する方法について何か提案があれば、非常に感謝しています。ありがとうございました。

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で定義されているすべてのテーブルのリストであることに注意してください。これは、ビューのヘルパーですべてのテーブルのリストを生成するために使用されます。ビューのスクリプトは、ドロップダウンから別のテーブルが選択されるたびに起動するjQueryイベントハンドラーを登録します。ハンドラーは関数(/static/js/web2py.jsにあります)を呼び出します。この関数は、Ajaxを介してid="form"を使用してフォームコンポーネントをdivにロードします。選択したテーブルの値をURLに追加します。dbSELECT()<select>web2py_component()

コントローラでは、form()関数はrequest.args(0)でdbテーブル名をチェックします。次にresponse.generic_patterns、「generic.load」ビューが許可されるように設定します(デフォルトでは、ジェネリックビューはローカルリクエストに対してのみ有効になります)。または、独自の「form.load」ビューを定義することも、別の拡張子(「form.html」など)を使用することもできます。

フォームはweb2pyAjaxコンポーネントとして読み込まれるため、フォームの送信はトラップされ、Ajaxを介して送信されます。そのため、ページ全体が再読み込みされることはありません。

于 2012-04-30T18:42:29.553 に答える