0

TastyPie を使用して新しいユーザーを登録しています。警告ボックスに検証メッセージをユーザーに表示したいと思います。私は、TastyPie が次の結果を返すことに気付きました:responseJSONresponseText.

responseJSON Object { accounts/create={...}}

accounts/create
    Object { email=[1], password2=[1]}

responseText
    "{"accounts/create": {"email": ["This field is required."], "password2": ["This field is required."]}}"

検証をユーザーに表示し、これを正しく解析するにはどうすればよいですか? TastyPie には、エラーを解析する組み込み関数がありますか?

これは私がこれまでに実行したエラーですが、エラーメッセージは表示されません:

 error: function(errorThrown){
                      data = JSON.parse(errorThrown.responseText);
                      alert(data.error)
                      console.log(errorThrown);
                  }
              });
4

2 に答える 2

2

あなたのエラーはjQuery側にあるようです。エラーキーは、別の方法で定義された関数を指しています (こちらを参照)。

error タイプ: Function( jqXHR jqXHR, String textStatus, String errorThrown ) リクエストが失敗した場合に呼び出される関数。関数は 3 つの引数を受け取ります。jqXHR (jQuery 1.4.x では XMLHttpRequest) オブジェクト、発生したエラーの種類を説明する文字列、およびオプションの例外オブジェクト (発生した場合) です。2 番目の引数 (null 以外) に指定できる値は、"timeout"、"error"、"abort"、および "parsererror" です。HTTP エラーが発生すると、errorThrown は「Not Found」や「Internal Server Error」などの HTTP ステータスのテキスト部分を受け取ります。jQuery 1.5 以降、エラー設定は関数の配列を受け入れることができます。各関数が順番に呼び出されます。注: このハンドラーは、クロスドメイン スクリプトおよびクロスドメイン JSONP リクエストでは呼び出されません。

したがって、JS コードは次のようになります。

error: function(jqXHR, textStatus, errorThrown) {
    ...
},

しかし実際には、django からデータを返せば成功です。jQuery の「エラー」は、セマンティック エラーではなく、通信エラーを意味します。

あなただけを使用する場合

error: function(jqXHR, textStatus, errorThrown) {
    alert("An error!")
},

おそらく呼び出されないことがわかるでしょう (呼び出されるには、django から 400/500 エラー コードを返す必要があります)。

したがって、「真の」成功の場合に正常に返されるものと、サーバー側の障害の場合に正常に返されるものを区別することができます。

# and/or answer.data['errorMessage'] = "Error type II"
answer.data['success'] = False
return answer

そしてjQueryで:

success: function(data, textStatus, jqXHR) {
    //  instead of checking for success, you can check the content of
    //  the "accounts/create" key
    // if (!data.success) {

    // I assume that this key won't be present in case of error.
    if (data["accounts/create"]) {

        alert("Errors will now be displayed")
        // ...here, the same code in Corinne Kubler's answer; or you
        // can make it more jQueryish with e.g. .each()
        return;
    }
    alert("Everything OK, proceeding")
    // ...
}

于 2013-10-22T22:53:33.690 に答える
1

次のようなものを試してください:

    var jsonString = '{"accounts/create": {"email": ["This field is required."], "password2": ["This field is required."]}}';
    var data = JSON.parse(jsonString);
    var inputsInError = (data["accounts/create"]);
    for (var key in inputsInError) {
       if (inputsInError.hasOwnProperty(key)) {
           alert(key + " -> " + inputsInError[key]);
       }
     }

jsFiddle を参照してください: http://jsfiddle.net/q7Tuh/

于 2013-10-22T22:19:31.230 に答える