web-dev-qa-db-ja.com

AJAX post in Djangoの後のリダイレクト

Djangoの組み込みのDeleteViewを使用し、_success_url_属性に値を割り当てました。テンプレートで、JQueryの$ .post()メソッドを使用してこのビューをトリガーします。アイテムを削除しても、_success_url_にリダイレクトされません。いくつか検索したところ、リダイレクトを無視するAJAX postメソッドの問題であると思われます。

JQueryで$.post()の3番目のパラメーターとして_window.location="#myRedirectionURL"_を設定する関数を追加することで修正しました。

しかし、この方法はあまりDjangoではないようです。基本的には、DjangoではなくAJAXの観点から問題を解決します。さらに、それはDeleteViewに_success_url_を残しません(ただし、_success_url_に値を割り当てる必要があります。そうしないと、Djangoはエラーが発生します)。

それで、AJAX経由で投稿するときにリダイレクトされる正しい方法ですか?それを行うためのより良い方法はありますか?

どうもありがとう。

24
Xiao Liang

Ajaxはページをリダイレクトしません!

リダイレクトから取得するのは、POST応答のデータオブジェクト内の新しいページからのHTMLコードです。

何らかのアクションが失敗した場合にユーザーをリダイレクトする場所がわかっている場合は、次のようにするだけです。

サーバーでは、

エラーが発生した場合

response = {'status': 0, 'message': _("Your error")} 

すべてがうまくいった場合

response = {'status': 1, 'message': _("Ok")} # for ok

応答を送信します。

return HttpResponse(json.dumps(response), content_type='application/json')

hTMLページ:

$.post( "{% url 'your_url' %}", 
         { csrfmiddlewaretoken: '{{ csrf_token}}' , 
           other_params: JSON.stringify(whatever)
         },  
         function(data) {
             if(data.status == 1){ // meaning that everyhting went ok
                // do something
             }
             else{
                alert(data.message)
                // do your redirect
                window.location('your_url')
             }
        });

ユーザーの送信先がわからず、サーバーからそのURLを取得したい場合は、それをパラメーターとして送信します。

response = {'status': 0, 'message': _("Your error"), 'url':'your_url'} 

次に、ウィンドウの場所でそれを置き換えます:

 alert(data.message)
 // do your redirect
 window.location = data.url;
25
brunofitas

http://hunterford.me/how-to-handle-http-redirects-with--jquery-and-Django/

編集:ソースを利用できません

これは私にとってはうまくいく、おそらくハックのように見える

Djangoミドルウェア

from Django.http import HttpResponseRedirect

class AjaxRedirect(object):
    def process_response(self, request, response):
        if request.is_ajax():
            if type(response) == HttpResponseRedirect:
                response.status_code = 278
        return response

javaScript

$(document).ready(function() {
    $(document).ajaxComplete(function(e, xhr, settings) {
        if (xhr.status == 278) {
            window.location.href = xhr.getResponseHeader("Location");
        }
    });
});
4
mixo

Django-ajaxのajaxPostでは、通常のリダイレクト(URL)を(json応答として)渡すと、リダイレクトが可能になります。私の場合、jquery ajax()メソッドは機能しませんでした。

0