0

私はDjangoを初めて使用し、クリックすると「X」がマークされる10x10ボードを持つゲームを作成しています。モデルの 1 つで、各ボード セルの値を格納する属性があり、デフォルトで空白に設定されています。ボードをjqueryでマークできます。ただし、クリックしたセルがマークされていることをサーバー側に知らせるために、データをサーバー側に送信したいと考えています。そうすれば、ゲームを終了して後で再度アクセスすると、ボードにはマークされたセルに「X」が表示されます。

これは、HTML ページに埋め込まれた jquery コードです。

<script>
$(document).ready(function(){ 
    $('.target_cell').click(function(){ 
        if ($(this).text() != "X" && $(this).text() != "H"){
            $(this).text("X");
            var spot = $(this).attr('name'); //Cell index number like in an array
            $.post("/play_game/{{game.id}}/", spot);
        }
        else{
            alert("Spot already taken!");
        }
    });
});
</script>

jquery .post メソッドによってアクセスされているビューのコードは次のとおりです。

def play_game(request, game_id):
    game = fetch_game(request.user, game_id)
    if request.method == 'POST':
        spot = request.POST['spot']
        game.creator_target_board[int(spot)] = "X"
    variables = RequestContext(request, {
        'game': game,
        'set_board': game.creator_ship_board,
        'target_board': game.creator_target_board
    })
    return render_to_response('battleship/play_game.html', variables)

私は現在、テストのためだけに自分のビューで csrf_exempt を使用しています。ボードのセルをクリックすると、「X」とマークされますが、サーバー ログには 500 エラーが表示されます。これを修正する方法についてのアイデアはありますか? 前もって感謝します!

4

1 に答える 1

0

あなたの urls.py はどのように見えますか?

次のようにして、投稿の代わりに ajax を使用することをお勧めします。

urls.py に追加:

url(r'^target_spot/(?P<game_id>\d+)/(?P<spot>\d+)/$', target_spot, name='target_spot'),

あなたのJavaScript呼び出しで:

$.ajax("/target_spot/{{game.id}}/" + spot);

ビューに次を追加します。

def target_spot(request, game_id, spot):
    if request.is_ajax():
        game = fetch_game(request.user, game_id)
        game.creator_target_board[int(spot)] = "X"

このアプローチの利点は、ロジックを分離し、コードをよりクリーンにし、サーバーが投稿リクエストごとにページを配信しないため、コードを高速化することです。

于 2013-01-18T18:34:58.737 に答える