如何设计Django / Javascript应用程序以提供对传统HTTP请求的条件Ajax响应?
在服务器上,我有一个自定义的Form对象。当浏览器发布表单的数据时,服务器根据现有数据和规则检查提交的数据(例如,如果表单将某个实体添加到数据库,该实体是否已存在于数据库中?)。如果数据通过,服务器将保存,生成ID号并将其添加到表单的数据中,并将表单和数据传递回浏览器。
if request.method == 'POST':
formClass = form_code.getCustomForm()
thisForm = formClass(data=request.POST)
if thisForm.isvalid():
saveCheck = thisForm.saveData()
t = loader.get_template("CustomerForm.html")
c = Context({ 'expectedFormObj': thisForm })
(请注意,我的自定义逻辑检查位于saveData()中,与isvalid()完成的html验证分开。)
到目前为止,标准Django(我希望)。但是如果数据没有通过,我想向浏览器发送一条消息。我想saveData()可以将消息放在表单的属性中,模板可以检查该属性,将其数据嵌入为javascript变量并包含一个javascript函数来显示消息。但是将所有形式的html传回去,只是添加一条消息,似乎不够优雅(标准的Django表单提交过程也是如此,但没关系)。在这种情况下,我想传回信息。
现在我想我可以将Javascript函数绑定到html表单的onsubmit事件,并让该问题出现XMLHttpRequest,并让服务器根据saveData()调用的输出对其进行响应。但随后浏览器对服务器有两个请求(POST和XHR)。也许成功的saveData()会重写整个页面并消除任何冲突的可能性。但我还必须让服务器对XHR的响应进行排序,以跟踪对POST的响应,并找出如何将saveData结果传递给对XHR的响应。我想这是可行的,即使没有我不知道的线程编程,但它看起来很混乱。
我推测我可能会使用javascript使浏览器的响应成为对POST请求的响应中的某些条件(重写整个页面,或者只显示一条消息)。但是我怀疑页面的javascript手控制了POST请求,并且对POST的任何响应只会重写页面。
所以我可以设计一个进程来传递整个表单只有服务器端saveData()工作,并且如果saveData()没有重写整个表单而显示的消息?如果是这样,怎么样?
答案 0 :(得分:3)
虽然您可以安排视图来检查请求数据以确定响应应该是AJAXish还是纯HTML,但我并不是真的推荐它。将AJAX请求处理程序放在一个单独的URL结构中,例如,所有常规html视图都有像/ foo / bar这样的URL,并且相同信息的相应api调用将是/ ajax / foo / bar。
由于大多数视图都会检查请求数据,然后进行一些处理,然后创建一个python字典并将其传递给模板引擎,您可以将公共部分分解出来以使其更容易一些。前几个步骤可以是只返回python字典的泛型函数,然后通过将处理函数包装在模板渲染器或json编码器中来组成实际响应。
我通常的工作流程是最初假设客户端没有javascript(这仍然是一个有效的假设;许多移动浏览器没有JS)并将应用程序实现为静态GET
和POST
处理程序。从那里开始,我开始寻找我的应用程序可以从一个小客户端脚本中受益的地方。例如,我通常会重新设计表单以通过AJAX类型调用提交,而无需重新加载页面。这些请求不会像普通的html表单版本那样将它们的请求发送到相同的URL / django视图,因为响应需要是纯文本或html片段中的简单成功消息。
同样,从服务器获取数据也经过重新设计,以简洁的JSoN文档进行响应,以便处理到客户端的页面中。这也是一个单独的URL / django视图,作为该资源的相应普通html。
答案 1 :(得分:3)
在处理AJAX时,我使用它:
from django.utils import simplejson
...
status = simplejson.dumps({'status': "success"})
return HttpResponse(status, mimetype="application/json")
然后,AJAX(jQuery)可以根据'status'的返回值做它想做的事。
我不确定你对表格的确切要求。如果您想要更简单,更好的表单体验,我建议您查看uni-form。 Pinax在投票应用中很好地实现了这一点。
答案 2 :(得分:0)
仅供参考,这不是答案......但它可能会帮助您以不同的方式思考
以下是我遇到的问题...... Google App Engine + jQuery Ajax = 405 Method Not Allowed。
所以基本上我使用概述的代码得到了工作,然后我无法发出AJAX请求:(。