1

Djangoアプリに取り組んでいますが、ajaxとjQueryに問題があります。

私のページには、ボタンがクリックされたときに呼び出されるjavascript関数があります。この関数の目的は、djangoviewメソッドを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データを使用してページをレンダリングできますが、ページ全体をレンダリングすることはできません。つまり、応答するページには、headではなくbodyタグのみが含まれます。

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

ノート:

  • どちらの場合も、2種類のエラーが処理されます。成功した応答で示されたエラー、および合計HTTPエラー(内部サーバーエラーなど)。
  • どちらの場合も、url、、urlおよびクエリパラメータ、dataが関数に渡されると想定されています。
  • 最初のケースでは、URLを返すようにサーバー側スクリプトを変更する必要があります。
于 2012-12-01T03:17:38.467 に答える