我是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错误。有想法该怎么解决这个吗?提前谢谢!
答案 0 :(得分: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"
这种方法的优点在于,您可以分离逻辑,使代码更清晰,更快,因为服务器不会在每个发布请求时都提供页面