代码之家  ›  专栏  ›  技术社区  ›  chernevik

django/javascript可以处理对HTTP POST请求的条件“ajax”响应吗?

  •  0
  • chernevik  · 技术社区  · 15 年前

    我如何设计一个django/javascript应用程序来提供对传统HTTP请求的条件Ajax响应?

    在服务器上,我有一个定制的表单对象。当浏览器发布表单的数据时,服务器会根据现有的数据和规则检查提交的数据(例如,如果表单向数据库添加了某个实体,那么该实体是否已经存在于数据库中?)。如果数据通过,服务器将保存、生成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验证是分开的)。

    到目前为止,标准的姜戈(我希望)。但是如果数据不通过,我想给浏览器发送一条消息。我想savedata()可以将消息放入表单的属性中,模板可以检查该属性,将其数据嵌入为javascript变量,并包含一个javascript函数来显示消息。但是,将所有的HTML表单传递回去,仅仅是为了添加一条消息,这看起来不太好(就像标准的Django表单提交过程一样,但没关系)。那样的话,我只想把信息传回去。

    现在,我想我可以将一个javascript函数绑定到HTML表单的onSubmit事件,并发出一个xmlhttpRequest,让服务器根据savedata()调用的输出响应它。但是,浏览器有两个对服务器的未完成请求(POST和XHR)。也许一个成功的savedata()会重写整个页面并消除任何潜在的冲突。但我还必须让服务器对XHR的响应进行排序,以跟踪对POST的响应,并找出如何将保存的数据结果与对XHR的响应进行通信。我想这是可行的,即使没有线程编程,我也不知道,但看起来很混乱。

    我推测我可能会使用javascript使浏览器的响应对POST请求的响应有条件(重写整个页面,或者只显示一条消息)。但是我怀疑页面的javascript通过post请求来控制浏览器,任何对post的响应都会重写页面。

    因此,我是否可以设计一个流程,仅当服务器端savedata()工作时才返回整个表单,如果savedata()不工作,则不重写整个表单而显示消息?如果是这样,怎么办?

    3 回复  |  直到 15 年前
        1
  •  3
  •   SingleNegationElimination    15 年前

    尽管您可以安排视图检查请求数据,以决定响应应该是一个半成品还是纯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。

        2
  •  3
  •   Adam Nelson    15 年前

    在处理Ajax时,我使用以下方法:

    from django.utils import simplejson
    ...
    status = simplejson.dumps({'status': "success"})
    return HttpResponse(status, mimetype="application/json")
    

    然后,Ajax(jquery)可以根据“status”的返回值执行它想要的操作。

    我不知道你到底想要什么样的表格。如果你想要一个更简单,更好的形式体验,我建议退房。 uni-form . Pinax 在他们的投票应用程序中很好地实现了这一点。

        3
  •  0
  •   Community miroxlav    7 年前

    仅供参考,这不是一个答案……但它可能有助于你以不同的方式思考

    这就是我遇到的问题… Google App Engine + jQuery Ajax = 405 Method Not Allowed .

    所以基本上,我可以使用所概述的代码来工作,然后我就不能发出Ajax请求:(。