所以我正在使用Django构建战舰游戏。我想要做的是,一旦游戏结束,用我的得分和当前用户在我的数据库中创建一个新的游戏对象。我的游戏模型如下所示:
class Game(models.Model):
user = models.ForeignKey(User)
score = models.IntegerField(default=0)
date = models.DateTimeField(auto_now_add=True)
win = models.BooleanField(default=False)
def save(self, *args, **kwargs):
if self.score < 0:
self.score = 0
super(Game, self).save(*args, **kwargs)
def __unicode__(self):
return unicode(self.date)
实际游戏是用JS编写的,你和AI一直在轮流直到你们其中一人获胜,此时你的分数就会计算出来。这是我想用新游戏更新我的数据库的地方,但我不知道如何去做。我正在考虑提交一个提交按钮,让视图在POST请求中创建一个新的游戏对象,但我不知道如何通过分数&amp;赢/输变量。任何帮助将不胜感激。
答案 0 :(得分:1)
嗯,有很多方法可以达到这个目的,但我会在这里放一个简单的例子
从网址开始:
url(r'^end-game/?','your_app.views.end_game', name='end-game'),
然后在your_app.views上
import datetime
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from your_app.models import Game
@login_required(redirect_field_name=None, login_url='login')
def end_game(request):
# Get the post variables
score = request.POST['score']
win = request.POST['win']
# You may want to validate data here
# Create the game object
try:
game = Game.objects.create(
user = request.user.id,
score = score,
win = win,
date = datetime.datetime.now()
)
game.save()
# Setting output
response = {
'status': 1,
'message': 'Game saved'
}
except Exception as e:
# Something went wrong
response = {
'status': 0,
'message': 'Something went wrong - ' +str(e)
}
return HttpResponse(response, mimetype='application/json')
HTML:
$.post( "{% url 'end-game' %}",
{
csrfmiddlewaretoken: '{{ csrf_token}}' ,
score : score, //pass the score here
win: win // pass the win value here
},
function(data) {
if(data.status == 1){
// success! Do something
}
else{
// error! Do something
}
});
您还可以使用表单,将其隐藏起来并在游戏结束时提交。这样做有一些优点,比如在表单本身上进行验证和保存功能,但由于你只需要两个变量,所以上面应该没问题。
此外,您应该使用类似
的内容if request.method is POST:
在您执行任何操作之前,在尝试读取它们之前检查POST值是否已设置...
if 'score' in request.POST:
这只是一个例子,没有经过测试,但应该按原样运作
答案 1 :(得分:0)
这是一个广泛的问题......但是当游戏通过AJAX结束时(不需要用户输入),您可以轻松地将JavaScript应用程序POST
分配到URL /视图。该视图应指向ModelForm以验证数据,并将save()
指向数据库。