通过javascript更新Django数据库

时间:2015-03-23 14:23:25

标签: javascript django database

所以我正在使用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;赢/输变量。任何帮助将不胜感激。

2 个答案:

答案 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()指向数据库。