2016-03-19 20 views
1

私はweb2pyのajax機能を使用してフォームをexplained in the bookとして送信しようとしていますが、SQLFORMの代わりにFORMを使用しています。データをデータベースに格納したくないためです。AJAX経由で送信されたweb2pyフォームを検証する方法は?

def ajax_test(): 
    form = FORM(
     INPUT(_type="text", _name="mytext", _id="mytext", 
       requires=IS_NOT_EMPTY()), 
     INPUT(_type="submit"), 
     _id="myform" 
    ) 

    if request.ajax: 
     if form.accepts(request.vars, session): 
      return DIV("Form submitted.") 
     elif form.errors: 
      return TABLE(*[TR(k, v) for k, v in form.errors.items()]) 
     else: 
      return DIV("Couldn't check form.") 

    return dict(form=form) 

フォームが送信される(request.ajax == True)、form.acceptsform.errorsリターンFalse両方:default.py内部

{{extend "layout.html"}} 
<h2>Form</h2> 
{{=form}} 
<script> 
    jQuery("#myform").submit(function() { 
    ajax("{{=URL('ajax_test')}}", 
     ["mytext"], "output"); 
    return false; 
    }); 
</script> 
<h2>Output</h2> 
<div id="output"></div> 

コントローラajax_test.html

request.vars.mytextでユーザーの入力にアクセスしても、web2pyの機能を使用する代わりに、自分で検証する必要があります。

私には何が欠けていますか?

答えて

3

sessionオブジェクトをform.accepts()に渡すと、フォームに非表示の_formkeyフィールドを追加することで、クロスサイト要求偽装保護が自動的に実装されます。フォームが送信されると、この隠しフィールドの値がセッションに格納されている値と比較され、一致が失敗するとフォームは受け入れられません。

あなたのコードを持つ2つの問題があります。まず、Ajaxリクエストがあるときにform.acceptsに電話するだけなので、_formkeyは生成されず元のフォームに含まれます。それを修正するには、以下を試してみてください。

form.process() 
if request.ajax: 
    if form.accepted: 

form.process()form.accepts(request, session)のためだけのショートカットです。上の例では、フォームが作成されたときに最初の非Ajax呼び出しであっても呼び出されます。これにより_formkeyの値が生成され、セッションに格納されます。

第2に、JavaScriptコードはフォーム全体を提出するのではなく、mytextフィールドのみを送信するため、非表示の_formkey値はサーバーにポストされません。結果として、フォームは受け入れられません(web2pyは、このようなエラーは一般にファウルの結果であるため、この場合はエラーを表示しません)。

は、私はそれが文書化されてわからないんだけど、ajax()関数の第二引数ではなく、選択した要素がシリアル化され、提出されている内部のすべてのフォーム要素になりますjQueryのセレクタとすることができます。だから、試してみてください。

ajax('{{=URL('ajax_test')}}', '#myform', 'output'); 

#myformセレクタは隠しフィールドを含め、シリアライズされた全体の形になりますがformオブジェクトに含まれています。

+0

こんにちはアンソニーは答えてくれてありがとう。私は第2引数を '' #myform "'に変更しましたが、私は同じ結果を得ています。私は '_formkey'隠し値を知っていましたが、何らかの理由でそれが生成されていません。フォームのHTMLコードは次のとおりです。

<入力タイプ="提出 "/>
'。何か案は? – cdonts

+0

最新の回答をご覧ください。フォームが最初に作成されたときにフォームを処理しなければならないので、コードは 'if request.ajax:'ブロック内にあることができません。 – Anthony

+0

パーフェクト!どうもありがとう。 – cdonts

関連する問題