Django - 如何将 javascript 变量保存到 Django 数据库中? [复制]

Posted

技术标签:

【中文标题】Django - 如何将 javascript 变量保存到 Django 数据库中? [复制]【英文标题】:Django - How to save javascript variable into Django Database? [duplicate] 【发布时间】:2018-09-05 02:42:52 【问题描述】:

我有一个名为“counter”的 javascript 变量,我想用它来更新在 models.py 中实例化的计数器变量。

这是models.py的快照

class Player(BasePlayer):
    #track the number of times the user has lost window focus
    blur_quantity = models.IntegerField(initial=0) 

这是 pages.html 的示例

% block content %
<button name="blur_button" value=counter onclick="Warn()" class="btn btn-primary btn-large">Blur Button</button>


% endblock %
% block scripts %
    <script>
        var counter  = 0;
       // Tracks window blurs
       $( document ).ready(function() 
          function onchange (evt) 
            counter++;
            console.log(counter);
          

          window.onblur = onchange;

        );  

        function Warn() 
            alert(counter);
        
</script>
% endblock %

现在,每当用户单击按钮时,“计数器”的值都应该存储在某处。如何更新 models.py(例如我的 Django 数据库)中 blur_quantity 的值以反映附加到 blur_button 的值?

【问题讨论】:

与 Ajax 一起,您应该看看如何将 CSRF 与安全性集成; ***.com/questions/6506897/… 【参考方案1】:

JavaScript:

   var counter = 0;

  $( document ).ready(function() 
     function onchange (evt) 
       counter++;
       $.ajax(
         url: '/update_counter/',
         data: 'counter': counter,
         type: 'POST'
       ).done(function(response)
         console.log(response);
       );
     

     window.onblur = onchange;

   ); 

views.py:

from django.http import HttpResponse
from models import Player

def update_counter(request):
    if request.method == 'POST':
        player = Player.objects.get()
        player.blur_quantity =  request.POST['counter']
        player.save()
        message = 'update successful'
    return HttpResponse(message)

urls.py:

from django.conf.urls import url

from views import update_counter

urlpatterns = [
   url(r'^update_counter/', update_counter)
]

基本上,JavaScript 中的ajax 调用通过POST 请求将counter 发送到服务器。 urls.py 将请求路由到您的 update_counter 方法,该方法使用 counter 的值更新数据库。最后,update_counter 方法返回一个响应,由 JavaScript 中的done 函数处理。

【讨论】:

非常感谢您为此所做的工作。我应该将 urls.py 保存在我的根目录中吗?这是它应该包含的唯一行吗?我正在使用库 otree,它只向我公开views.py 和models.py,所以我从未见过urls.py 没问题 :) urls.py 通常与您的 models.pyviews.py 位于同一目录中。我已经更新了答案以反映 urls 文件通常的样子。我不确定 otree 会如何影响这一点。我建议查看 Django urls 文档 (docs.djangoproject.com/en/1.8/topics/http/urls) 了解更多信息。请注意,如果您使用的是 Django 2.0,它可能看起来与我的示例有些不同。 你能看看这个吗:- ***.com/questions/66610832/…【参考方案2】:

onChange 方法中,您可以向服务器的一个端点发送POST 请求,并让服务器从那里更新数据库。然后服务器将使用最新值blur_quantity 作为对POST 请求的响应,并将此值用作您的新counter

【讨论】:

我对此知之甚少,很难理解这个答案,抱歉。我目前在本地运行这一切,并且有两个页面 models.py 和 pages.py。发布请求是什么样的? 这可以分解为客户端(一般是 js)和服务器端(你的情况下是 django)。客户端:developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/send 你可以看看这个来学习如何发送一个 POST 请求服务器端:django-rest-framework.org/tutorial/2-requests-and-responses 查找request.method == 'POST' 语句,你可以从request.data 更新你的数据库,并返回一个有效的响应跨度> 谢谢!会尝试一下

以上是关于Django - 如何将 javascript 变量保存到 Django 数据库中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将javascript变量传递给django模板标签

在 Javascript / jQuery 中无法检索 Django 模板变量值

缺少变量值时 Django 模板中的 Javascript 语法错误

将 Django 变量值分配给 AngularJS

Django,当单个模型变大时模型拆分?

如何将过程中的变量值传递给 Apex 中的 Javascript 函数