djangoプロジェクトでajaxリクエストに問題があります。停止して500エラーが返されるように見える場所が見つかるまで、どこにでもprintステートメントを追加してビューコードをデバッグしようとしました。なぜこれが起こっているのかわからないので、もう少し経験のある人が何が悪いのかを知ってくれることを望んでいました。
私が使用しているjavascriptライブラリは、jQuery(ただし、ajax呼び出しのみ)とGogoMakePlay(GogoMakePlay.com)です。
このアプリケーションは、チェス盤を表示するためのdjangoとjavascript(GogoMakePlay)のバックエンドを備えたブラウザベースのチェスゲームです。この状況では、チェス盤が表示され、駒をクリックすると、可能な動きのjsonを返すdjangoビューにajax呼び出しを行うことになっています。印刷機能が実行されるように毎回ポーンピースをクリックしますが、今回は問題を見つけることができなかったはずです。
私の問題はこれとほとんど同じです:
AjaxPOSTリクエスト内に新しいDjangoモデルオブジェクトを作成できません
彼とは異なり、私の問題はただ消えただけではありませんでした。
問題のビュー:
def get_move_options(request):
if request.POST:
# initialise some variables based on the request type
pieceType = request.POST.get("pieceType")
pieceColour = request.POST.get("pieceColour")
pieceRow = request.POST.get("row")
pieceColumn = request.POST.get("column")
gameId = request.POST.get("gameId")
game = Game.objects.get(pk=gameId)
moves = Move.objects.filter(game=game)
print "initialised all the variables"
# check what type of piece it is
if pieceType == "pawn":
print "colour:" + pieceColour
piece = Pawn(pieceColour)
print "created the piece: " + piece # <-- this is never executed
elif pieceType == "king":
piece = King(pieceColour)
elif pieceType == "queen":
piece = Queen(pieceColour)
elif pieceType == "bishop":
piece = Bishop(pieceColour)
elif pieceType == "knight":
piece = Knight(pieceColour)
elif pieceType == "rook":
piece = Rook(pieceColour)
print "created the piece: " + piece
# make a new board and apply the moves to it
board = Board()
for move in moves:
board.makeMove(move)
print "made all the moves"
# get the possible moves
responseList = piece.getMoveOptions(pieceColumn, pieceRow, board)
return HttpResponse(json.dumps(responseList), mimetype="application/javascript")
ポーンコード:
class Pawn(Piece):
def __init__(self, colour):
print "creating object"
self.colour = colour
print "object created, the colour is: " + colour
*snip*
ajaxリクエストコード:
*snip*
// get the csrf_token from the page TODO there must be a better way of doing this
var csrf_token = document.getElementById("csrf_token").getElementsByTagName("input")[0].value;
// add the variables to the post data
var data = {
"gameId" : gameId,
"pieceType" : piece.S.type,
"pieceColour" : piece.S.colour,
"column" : column,
"row" : row,
};
var url = "ajax/getMoveOptions";
// make the ajax call
$.ajax({
type : 'POST',
// add the csrf_token or we will get a 403 response
headers : {
"X-CSRFToken" : csrf_token
},
url : url,
data : data,
dataType : "json",
success : function(json) {
// loop through the json list
for(var i = 0; i < json.length; i++) {
// change the square colour of the options
var x = json[i]["row"];
var y = json[i]["column"];
var option = G.O["square" + y + x];
if(y % 2 == x % 2) {
var squareColour = "white";
} else {
var squareColour = "black";
}
option.setSrc("/static/images/board/" + squareColour + "Option.png").draw();
}
},
error : alert("I have now seen this too many times"),
});
*snip*
私のdjangoコンソールの出力:
*snip*
[01/Jun/2012 02:07:45] "GET /static/images/chess_pieces/white/king.png HTTP/1.1" 200 1489
initialised all the variables
colour:white
creating object
object created, the colour is: white
[01/Jun/2012 02:07:48] "POST /game/ajax/getMoveOptions HTTP/1.1" 500 10331
代わりにJavaScriptでコードを書くことができることは知っていますが、これは学校のプロジェクトであり、私の目標の1つはajax呼び出しを行う方法を理解することでした。
私はこれを何時間もグーグルしていて、私の問題に関連する前述のリンクだけを見つけました。通常、StackOverflowにはすべての答えがありますが、この場合、この質問をするためにアカウントを作成する必要があります。私の問題の解決策について同様の質問がある場合は、ご容赦ください。
だから私の質問は:
- あなたは私を助けるためにもっと多くの情報が必要ですか?もしそうなら、あなたは何を知る必要がありますか?
- 私のajax呼び出しは正しいですか?
- もしそうなら、なぜそれは500エラーを与えるのですか?そうでない場合、私は何を間違っているのですか?
- ビューの実行が開始されるのに、Pawnオブジェクトが作成された直後に停止するのはなぜですか?
よろしくお願いします=)