2013-10-20 58 views
0

我正在使用TastyPie註冊新用戶。我想在警告框中將任何驗證消息顯示回用戶。我注意到TastyPie給了我以下回:responseJSONresponseTextDjango API如何向用戶返回驗證消息

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

回答

2

你的錯誤似乎是在jQuery方面。 錯誤定義的函數的關鍵點不同(請參閱here)。

錯誤 類型:Function如果請求失敗(jqXHR jqXHR,字符串textStatus,字符串errorThrown) 一個函數被調用。 函數接收三個參數:jqXHR(在jQuery 1.4.x, XMLHttpRequest中)對象,描述發生的錯誤類型的字符串以及可選的異常對象(如果發生)。可能的 第二個參數的值(除了null)是「超時」,「錯誤」, 「中止」和「parsererror」。當發生HTTP錯誤時,errorThrown 會收到HTTP狀態的文本部分,例如「未找到」 或「內部服務器錯誤」。從jQuery 1.5開始,錯誤設置 可以接受一組函數。每個函數都會依次調用。 注意:此處理程序不針對跨域腳本和跨域JSONP請求調用。這是一個Ajax事件。

所以,你的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") 
    // ... 
} 

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/

相關問題