0

我是 Django 的新手,我正在制作一个有 10x10 板的游戏,如果点击它,它将被标记为“X”。在我的一个模型上,我有一个属性来存储每个板单元的值,并且它们默认设置为空白。我可以用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 而不是 post:

在 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 回答