从Javascript向Django服务器发出查询请求

5
我试图为网页添加一些基本的动态功能。如何在客户端使用JavaScript通过django访问服务器端的数据库信息?
我觉得应该很容易在网页上有一个JavaScript函数,调用django视图(或其他东西),然后django视图将一个值返回给JavaScript函数。我不希望JavaScript本身连接到数据库,因为这似乎会绕过django(对我来说,这是不正确的)。
此外,我希望能够在单个页面上通过JavaScript执行多个数据库请求。一个示例是创建发票的网页。每增加一行发票都需要对数据库进行新的查询。然后,根据添加到发票中的产品,需要进行额外的查询以确定该产品的价格。我的意思是在一个页面内动态地执行多个数据库查询。
基本上,我希望django执行数据库搜索并将信息传递给JavaScript。

1
通常使用的技术称为AJAX,它涉及在进行数据库调用后从Django视图返回XML或JSON,并且Javascript发出HTTP请求来调用这些视图。 - Michael Greene
考虑一下重新标记你的问题,加上ajax! - Paolo
4个回答

6
Javascript作为客户端,无法直接访问您的数据库。它能做的唯一的事情就是向Django发出请求。如果您想在不重新加载页面的情况下进行该请求,您需要使用ajax调用。
首先,像往常一样准备视图而没有javascript。查看jQuery并有效地发出相同视图的ajax调用。参见http://api.jquery.com/jQuery.get/http://api.jquery.com/jQuery.post/ 请求成功后,使用get/post调用的成功回调填充容器。
这是一个带有jQuery AJAX调用的简单示例Django应用程序:http://dl.dropbox.com/u/83342/ajaxapp.tar.gz

感谢提供示例应用程序的链接。我一直认为AJAX是答案,但在网络上找不到明确的“AJAX是您的答案”解决方案。我会查看您提供的应用程序。 - Garfonzo

3
将您的要求用“标准”术语表达,听起来像是您正在寻找从Django获得AJAX功能。
首先,坏消息是:没有任何Django特定于这种功能的功能。
好消息是: 您所说的Django视图将像任何其他视图一样接受HTTP请求。您需要做的就是编写一些JavaScript代码,生成自己的HTTP请求并消耗视图的输出,就像浏览器一样。
更好的消息是: 有像JQuery这样的JavaScript库,使得编写可靠的客户端异步请求(您想要的)变得更加简单。实际上,我强烈建议使用类似JQuery的库,而不是尝试编写自己的请求处理代码。在一个浏览器/机器上可靠地工作是一个简单的问题,但在今天广泛使用的所有浏览器中可靠地工作则非常困难和耗时。
希望这可以帮助您!

2
这真的帮了很大的忙!我慢慢意识到需要使用AJAX,但是在概念上无法理解一个Javascript函数、一个Django视图和一个AJAX函数(听起来像是一个糟糕笑话的开头)如何紧密结合以实现我所需的功能。 - Garfonzo
1
其实,有没有关于编写JavaScript以“消耗”来自Django的http请求输出的教程?我一直在搜索网络上关于如何a)通过urls.py让JavaScript调用特定的Django视图和b)如何将返回的值(可能是JSON数组)分配给JavaScript数组的信息。有什么想法吗? - Garfonzo
我简直不敢相信我把它拼成了“their”。应该是“there”——太残酷了。 - Garfonzo
1
我不确定是否有任何“JavaScript到Django”的教程,但是有很多通用的JavaScript异步Web请求教程。此外,除非您想在django视图中处理格式,否则它应输出JSON或XML(最好是JSON)。最后,关于优秀的JQuery教程,请访问此处:http://www.w3schools.com/jquery/default.asp - Ben Burns

2
我很晚才参加这个派对,但我相信这篇文章恰好符合您的要求。
相关的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替换为您自己的URL。变量data包含您的POST信息。在此示例中,它是具有IDtitleslugHTML输入. Django将接收/create/(您的URL),通过urls.py解析它,并像往常一样重定向到一个视图

然后,您只需使提交按钮调用此函数,而不是正常的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()

1

你说的没错,AJAX

如果你想深入了解它,可以考虑阅读MDN的AJAX页面作为入门阅读的好起点;然后在Stackoverflow上阅读 "Django最好的AJAX库是什么?",以进行更具体的研究。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接