Django / Javascript可以处理HTTP POST请求的条件“Ajax”响应吗?

时间:2009-10-02 18:11:50

标签: javascript python ajax django

如何设计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()没有重写整个表单而显示的消息?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:3)

虽然您可以安排视图来检查请求数据以确定响应应该是AJAXish还是纯HTML,但我并不是真的推荐它。将AJAX请求处理程序放在一个单独的URL结构中,例如,所有常规html视图都有像/ foo / bar这样的URL,并且相同信息的相应api调用将是/ ajax / foo / bar。

由于大多数视图都会检查请求数据,然后进行一些处理,然后创建一个python字典并将其传递给模板引擎,您可以将公共部分分解出来以使其更容易一些。前几个步骤可以是只返回python字典的泛型函数,然后通过将处理函数包装在模板渲染器或json编码器中来组成实际响应。

我通常的工作流程是最初假设客户端没有javascript(这仍然是一个有效的假设;许多移动浏览器没有JS)并将应用程序实现为静态GETPOST处理程序。从那里开始,我开始寻找我的应用程序可以从一个小客户端脚本中受益的地方。例如,我通常会重新设计表单以通过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-formPinax在投票应用中很好地实现了这一点。

答案 2 :(得分:0)

仅供参考,这不是答案......但它可能会帮助您以不同的方式思考

以下是我遇到的问题...... Google App Engine + jQuery Ajax = 405 Method Not Allowed

所以基本上我使用概述的代码得到了工作,然后我无法发出AJAX请求:(。