【发布时间】:2010-12-03 10:05:58
【问题描述】:
如何设计一个 Django/Javascript 应用程序来提供对常规 HTTP 请求的条件 Ajax 响应?
在服务器上,我有一个定制的 Form 对象。当浏览器 POST 表单的数据时,服务器会根据现有数据和规则检查提交的数据(例如,如果表单将某个实体添加到数据库中,该实体是否已经存在于数据库中?)。如果数据通过,服务器保存,生成一个 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() 无效则显示一条消息而不重写整个表单?如果有,怎么做?
【问题讨论】:
标签: javascript python ajax django