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経由で投稿するときにリダイレクトされる正しい方法ですか?それを行うためのより良い方法はありますか?
どうもありがとう。
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;
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");
}
});
});
Django-ajaxのajaxPostでは、通常のリダイレクト(URL)を(json応答として)渡すと、リダイレクトが可能になります。私の場合、jquery ajax()メソッドは機能しませんでした。