如何从django向ajax发送失败响应

时间:2016-06-09 19:29:14

标签: ajax django

我有这个Ajax请求:

django-admin
在Django方面,我有时想传播错误。 如果我引发异常,它将作为500响应INTERNAL ERORR传播。 但我想显示一条错误消息。 所以我试过

    $.ajax({
            url: "my_url",
            headers: {'X-CSRFToken': '{{ csrf_token }}'},
            type: "post",
            data:{x:1
                 },
            success: function(response, textStatus, xhr) {
                alert(response + textStatus + xhr);

            },
            error: function(xhr, ajaxOptions, thrownError) {
                alert(xhr.status + ' Error: ' + thrownError);
            }
          });

}

但我无法捕获自定义错误消息。 有什么想法吗?

对于你们这些人,我们想知道什么有用:

return HttpResponse("Bad permissions", status=500)

2 个答案:

答案 0 :(得分:3)

您可以采用的一种方法如下,

您可以在块周围的代码周围尝试异常块,这些代码容易引发异常。有很多Exception子类可以覆盖例如引发的异常类型。 Model.DoesNotExist。在这些异常块中,您只需创建适当的HttpResponse并将其发回。让我们举一个例子。

class DemoView(View):
    def post(self, request, oid, *args, **kwargs):
    try:
        object = Model.objects.get(id=oid)
    except Model.DoesNotExist:
        return HttpResponseNotFound('error message')

这样你的错误块就会在你的ajax函数中执行。您可能会认为这是一种方法,对我来说似乎是一种正确的方法。

<强>更新 根据您在下面做出的评论(OP),您可以按照以下方式创建回复

def bad_request(message):
    response = HttpResponse(json.dumps({'message': message}), 
        content_type='application/json')
    response.status_code = 400
    return response

当您想要返回状态400时,您只需

return bad_request(message='This is a bad request')

因此,在您的ajax错误函数中,您可以使用以下内容来获取该消息,

xhr.responseJSON.message

答案 1 :(得分:0)

这是Django 3.0和Python 3.0的版本。首先定义JsonResponse的子类:

class FailedJsonResponse(JsonResponse):
    def __init__(self, data):
        super().__init__(data)
        self.status_code = 400

在您自己的代码中使用它:

return FailedJsonResponse({"e": "Error message"})