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) 请求失败时调用的函数。该函数接收三个参数:jqXHR(在 jQuery 1.4.x 中,XMLHttpRequest)对象、描述发生的错误类型的字符串和可选的异常对象(如果发生)。第二个参数(除了 null)的可能值是“timeout”、“error”、“abort”和“parsererror”。发生 HTTP 错误时,errorThrown 会接收 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 回答