【问题标题】:Update Django database through javascript通过 javascript 更新 Django 数据库
【发布时间】:2015-03-23 14:23:24
【问题描述】:

所以我正在使用 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 请求上创建一个新的游戏对象,但我不知道如何将分数和赢/输变量传递给它。任何帮助将不胜感激。

【问题讨论】:

    标签: javascript django database


    【解决方案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')
    

    javascript(在 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:
    

    这只是示例,未经测试,但应该可以正常工作

    【讨论】:

    • 请永远不要这样做except Exception as e:
    • 最好将HttpResponse替换为JsonResponse,应该从from django.http import JsonResponse导入。这种类型的响应处理 json 标头,您不需要包含每个版本的 django 不支持的 mimetype
    • 在开始实现之前我有一个问题:如果我发送一个请求,当前页面的渲染会消失吗?我想保存数据,但也要确保有动画而不需要“重新渲染”页面。我只是问这样我可以节省一些时间。
    【解决方案2】:

    这是一个宽泛的问题...但是当游戏通过 AJAX 结束时,您可以轻松地将 JavaScript 应用程序POST 得分到 URL/视图(不需要用户输入)。该视图应指向ModelForm 以验证数据,并将save() 指向数据库。

    【讨论】:

      猜你喜欢
      • 2022-09-24
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      相关资源
      最近更新 更多