您的错误似乎在 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")
// ...
}