加载AJAX Call返回的文档

时间:2012-12-01 01:56:51

标签: javascript jquery python django document

我正在开发一个Django应用程序,我遇到了ajax和jQuery的问题。

在我的页面上,我有一个单击按钮时调用的javascript函数。这个函数的目的是创建一个ajax 调用django视图方法。在这个方法中,使用一些与AJAX调用一起发送的POST数据完成了一些逻辑,如果操作成功,我想返回 另一个页面,否则,我只是希望用户保持在同一页面上,并且会使用javascript向用户显示通知。

下面的

是一段代码:

(JavaScript)的

function makeCall() {

    $.post(url, data, function(data) {

          if(data=="ERROR") {

             alert("THERE WAS AN ERROR");

          } else {

             //send user to a new page. 
          }
    });
}

(Django的Python)的

def viewMethod(request):

   //LOGIC...  Renders page using POST data.

    if success:

        //... preparing the response.

        return HttpResponse(t.render(c))
    else:

        return HttpResponse("ERROR", content_type="text/plain")

如果操作成功,如何使用javascript / jQuery向用户显示响应页面?

由于

2 个答案:

答案 0 :(得分:1)

在viewMethod中,您可以使用POST数据而不是整个页面来呈现页面,也就是说,您将响应的页面只有body标签而不是head。

if success:
    return HttpResponse('<body><p>SUCCESS</p></body>')

并在前端

$.post(url, data, function(data) {

      if(data=="ERROR") {

         alert("THERE WAS AN ERROR");

      } else {

         $('tip').append(data)
      }
});

如果您仍然使用整个页面,它的形式如下:,您可以使用window.open或iframe标记来处理它。 但我建议只回复一些html片段。

答案 1 :(得分:1)

除非在Django中有一些特性,否则应该没有什么可以阻止POST请求与GET请求的行为不同。两者都应该能够返回URL字符串。

如果您希望接收网址并替换当前文档,请尝试以下操作:

function makeCall(url, data) {
    function newPageError(jqXHR, textStatus, errorThrown) {
        alert(textStatus + ' : ' + errorThrown);
    }
    $.post(url, data).success(function(data, textStatus, jqXHR) {
        if(!data.match(/^http/)) {
            newPageError(jqXHR, data, textStatus + ' - but error indicated');
        } else {
            location.href = data;
            //location.replace(data);//alternative; gives different Back button behaviour
        }
    }).fail(newPageError);
}

或者,如果您希望收到HTML代码段并在当前文档中工作,请尝试以下操作:

function makeCall(url, data) {
    function newPageError(jqXHR, textStatus, errorThrown) {
        alert(textStatus + ' : ' + errorThrown);
    }
    $.post(url, data).success(function(data, textStatus, jqXHR) {
        if(data.toUpperCase() == 'ERROR') {
            newPageError(jqXHR, 'ERROR', textStatus + ' - but error indicated');
        } else {
            $("#myDiv").html(data); //change jQuery selector to suit
        }
    }).fail(newPageError);
}

注意:

  • 在这两种情况下,都会处理两种错误;成功响应中指示的错误,以及总HTTP错误(例如,内部服务器错误)。
  • 在这两种情况下,都假定将url,url和查询参数data传递给函数。
  • 在第一种情况下,需要修改服务器端脚本以返回URL。