从 Javascript 到 Django 服务器进行查询

Posted

技术标签:

【中文标题】从 Javascript 到 Django 服务器进行查询【英文标题】:Make queries from Javascript to Django server 【发布时间】:2011-08-09 18:10:54 【问题描述】:

我正在尝试向网页添加一些基本的动态功能。如何在客户端使用 javascript 通过服务器端的 django 访问数据库信息?

我觉得在网页上拥有一个调用 django 视图(或其他东西)的 JavaScript 函数应该很容易,并且 django 视图会向 JavaScript 函数返回一个值。我不希望 JavaScript 本身连接到数据库,因为这似乎会绕过 django(在我看来,这似乎不正确)。

此外,我希望能够在单个页面上通过 JavaScript 执行多个数据库请求。一个示例是用于创建发票的网页。发票的每一行都需要对数据库进行新的查询。然后,根据添加到发票中的产品,需要额外的查询来确定该产品的价格。我得到的是动态完成一页内对数据库的多个查询。

基本上,我希望 django 进行数据库搜索并将信息传递给 JavaScript。

【问题讨论】:

一般技术通常称为 AJAX,涉及在您进行数据库调用后从 Django 视图返回 XML 或 JSON,以及 Javascript 发出调用这些视图的 HTTP 请求。 考虑是否重新标记您的问题添加 ajax! 【参考方案1】:

作为客户端的 Javascript 无法直接访问您的数据库。它唯一能做的就是向 Django 发出请求。如果您想在不重新加载页面的情况下执行该请求,则需要使用 ajax 调用。

首先,像往常一样准备您的视图,不要使用 javascript。看看 jquery 并进行有效的 ajax 调用来请求相同的视图。见http://api.jquery.com/jQuery.get/和http://api.jquery.com/jQuery.post/

请求成功后,使用get/post调用的成功回调填充一个容器。

这是一个带有 jQ​​uery AJAX 调用的简单示例 Django 应用程序:http://dl.dropbox.com/u/83342/ajaxapp.tar.gz

【讨论】:

感谢您提供指向示例应用程序的链接。我在想 AJAX 是答案,但在网上找不到明确的“AJAX 是你的答案”解决方案。我会看看你提供的应用程序。【参考方案2】:

为您的要求添加一些“标准”术语 - 听起来您正在寻找 Django 的 AJAX 功能。

首先,坏消息:没有专门针对这种功能的任何 Django 特性。

好消息: 您正在谈论的 Django 视图将像其他任何视图一样接受 HTTP 请求。您需要做的是编写一些 JavaScript 代码来生成自己的 HTTP 请求并像浏览器一样使用视图的输出。

好消息: 有像 JQuery 这样的 JavaScript 库,可以让编写可靠的客户端异步请求(你想要的)变得更简单很多。事实上,我强烈主张使用像 JQuery 这样的库,而不是尝试编写自己的请求处理代码。在一台浏览器/机器上可靠地工作是一个简单的问题,但在当今所有广泛使用的浏览器上可靠地地工作却非常困难和耗时。

希望这会有所帮助!

【讨论】:

这对很多人都有帮助!我慢慢意识到将需要 AJAX,但无法从概念上理解 Javascript 函数、django 视图和 AJAX 函数(这听起来像是一个坏笑话的开始)是如何捆绑在一起来做我需要的. 实际上,他们的教程是否有关于编写 Javascript 以“使用来自 django 的 http 请求的输出”的教程?我一直在网上搜索有关如何 a) 获取 Javascript 以通过 urls.py 调用特定 Django 视图和 b) 如何将返回值(可能是 JSON 数组)分配给 Javascript 数组的信息。有什么想法吗? (我不敢相信我拼成了“their”。应该是“there”——残酷) 我不确定是否有任何“JavaScript 到 Django”教程,但是有很多通用的 JavaScript 异步 Web 请求教程。此外,除非您想在 django 视图中处理格式,否则它应该输出 JSON 或 XML(最好是 JSON)。最后,想要获得优秀的 JQuery 教程,请访问:w3schools.com/jquery/default.asp【参考方案3】:

我参加聚会很晚了,但我相信 this 正是您要找的。​​p>

相关AJAX代码:

var create_note = function() 
  var title = $("#title").val()
  var slug = $("#slug").val()
  if (title != "" && slug != "")  // Fields must actually contain something
    var data =  title:title, slug:slug ;
    var args =  type:"POST", url:"/create/", data:data ;
    $.ajax(args);
  
  else 
    // display an explanation of failure -- optional for starters
  
  return false;
;

args 中的url 替换为您自己的网址。 data 变量包含您的 POST 信息。在此示例中,它是 html inputs 与 IDs titleslug。 Django 将接收/create/(您的 URL),通过urls.py 解析它,并将其重定向到view,就像往常一样。

然后您只需让您的提交按钮调用此函数,而不是普通的this.form.submit(); 或写type="submit",例如:

<input type="button" value="Submit" onClick="create_note();">

我省略了创建错误消息的过程。如果您刚刚开始,您可能还不想关心用户看到的内容。

最后,为了你的看法,你可以做这样的事情(记得路由通过urls.py!):

def create_note(request):
    note = Notes() # Sample Notes class for the purposes of this example
    note.text = request.POST['slug']
    note.title = request.POST['title'] # Just like what you would do normally!
    note.save()

【讨论】:

【参考方案4】:

你说了算,AJAX

如果您愿意深入研究,请考虑 MDN 的 AJAX 页面作为入门阅读的优质起点;然后在 *** 上添加“What is the best AJAX library for Django?”,以便针对您发布的问题进行更具体的进一步调查。

【讨论】:

以上是关于从 Javascript 到 Django 服务器进行查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中使用 Javascript 获取跨域数据?

Django:如何从views.py获取字典到javascript函数(html文件)

将字符串列表从 Django 传递到 Javascript

Django - 如何将 javascript 变量从另一个文件加载到模板

Django将Python对象从视图传递到模板中的Javascript脚本

如何将 utf-8 数据从 Django 传递到 javascript