1

Ajaxを使用してweb2pyでコントローラーを呼び出すコントローラーメソッドと対応するビューを作成しようとしています。アイデアは、データベースに小さな更新を行い、Ajaxを使用してターゲットdivに単純な更新されたメッセージを返すことです。以下はコントローラーの方法です。

def deleteajax():
recid1 = request.vars.recid
reptype1 = request.vars.reptype
if recid1 == None:
    out = 'Missing Param : recid'
    return out
if reptype1 == None:
    reptype1 = 'pr'        
if reptype1 == 'pr':
    row = db2(db2.prs_mailed.id==recid1).select().first()
    return str(row.id)
elif reptype1 == 'tb':
    row = db2(db2.tbs_mailed.id==recid1).select().first()
else:
    return 'Please provide the parameter : rep'
if row['action'] == 'D':
    out = 'Already deleted'
    return out
else:
    row.update_record(action='D')
    out = 'Deleted Successfully!'
    return out

これが私がビューから同じものを呼んでいる方法です:

     <form>{{
     response.write('<input type="hidden" name="recid" value="'+str(response._vars['prs']['id'][k])+'"/>',escape=False)}}
     <input type ='button' name="del" value = "D"  onclick="ajax('deleteajax', ['reid'], 'target')" />
     <div id="target"></div>
     </form>

POST呼び出しを使用してコントローラーを個別にテストしましたが、これは機能します。AJAX呼び出しでさえ機能し、ターゲットdivに「MissingParam:recid」のようなエラーメッセージを表示します。各ステートメントを終了した後、より多くのメッセージを表示するようにコントローラーを変更してみました。ただし、データベース操作を投稿すると、コントローラーからのコマンドは実行されず、ターゲットdivに何も表示されません。どこが間違っているのですか?

4

1 に答える 1

1

まず、これの代わりに:

{{response.write('<input type="hidden" name="recid" value="' +
    str(response._vars['prs']['id'][k])+'"/>',escape=False)}}

これを行うだけです:

<input type="hidden" name="recid" value="{{=prs['id'][k])}}"/>

response.writeを使用したり、response._varsを介して「prs」オブジェクトにアクセスしたりする必要はありません(response._varsのすべてのアイテムは、ビュー環境でグローバルに使用できます)。

Ajaxの問題に関しては、入力要素名は「recid」ですが、ajax()呼び出しは「reid」を参照しています。後者を「recid」に変更して、機能するかどうかを確認します。

アップデート:

複数の一意のrecidを作成するには、次のようにします。

name="{{='recid%s' % prs['id'][k]}}"

次に、コントローラーで、「recid」で始まるrequest.varsを確認します。

recid = [v for v in request.post_vars if v.startswith('recid')]
if recid:
    recid = int(recid[0][5:])
    [code to delete record with id==recid]
于 2012-06-21T15:26:45.320 に答える