1

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

在我的页面上,我有一个在单击按钮时调用的 javascript 函数。此函数的目的是对 django 视图方法进行 ajax 调用。在这种方法中,一些逻辑是使用通过 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 向用户呈现响应页面?

谢谢

4

2 回答 2

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 片段。

于 2012-12-01T02:59:18.187 回答
1

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

如果您希望接收 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 错误(例如内部服务器错误)。
  • 在这两种情况下,都假定将 urlurl和查询参数data传递给函数。
  • 在第一种情况下,需要修改服务器端脚本以返回 URL。
于 2012-12-01T03:17:38.467 回答