Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django/Close:如何通过AJAX验证AJAX表单?_Ajax_Django_Forms_Closures - Fatal编程技术网

Django/Close:如何通过AJAX验证AJAX表单?

Django/Close:如何通过AJAX验证AJAX表单?,ajax,django,forms,closures,Ajax,Django,Forms,Closures,我正在使用Django和Google的Closure javascript库,我想通过AJAX进行一些表单处理 目前,我在页面上有一个按钮,上面写着“添加分数”。当你点击它时,它会发出一个goog.net.Xhrio请求,通过调用loadForm(),加载另一个带有表单的URL,并在一个小弹出框中显示内容 加载的Django表单是一个非常基本的模型表单,具有一个简单的“score”属性,可以根据数字范围进行验证。以下是我必须处理表单提交的代码: def Score(request): obj

我正在使用Django和Google的Closure javascript库,我想通过AJAX进行一些表单处理

目前,我在页面上有一个按钮,上面写着“添加分数”。当你点击它时,它会发出一个goog.net.Xhrio请求,通过调用
loadForm()
,加载另一个带有表单的URL,并在一个小弹出框中显示内容

加载的Django表单是一个非常基本的模型表单,具有一个简单的“score”属性,可以根据数字范围进行验证。以下是我必须处理表单提交的代码:

def Score(request):
  obj = ScoreModel.get(pk=request.POST['obj_id'])
  form = ScoreForm(request.POST, instance=obj)

  if form.is_valid():
    form.save()
    messages.success(request, 'Score saved!')
    return shortcuts.redirect('index')
  else:
    context_vars = {'score': score, 'form': quarter_form}
    shortcuts.render_to_response(
        'score_form.html', context_vars,
        context_instance=context.RequestContext(request))
如果输入分数的表单本身只是显示在页面上,那么这一切都可以正常工作,但由于它是一个AJAX弹出窗口,因此无法正常工作。如果我只做一个简单的表单提交(通过HTMLSubmit按钮),如果数据有效,它就可以正常工作。但是如果数据无效,它不会在弹出窗口中显示有错误的表单,而是只在主浏览器窗口而不是弹出窗口中加载弹出窗口中显示的文本(有错误的表单)

相反,如果我通过上面的
loadForm()
JS方法提交表单,那么如果表单无效(并在弹出框中显示无效表单),它就可以正常工作,但是如果表单有效,它就不能正常工作(因为主索引页最终会显示在弹出框的innerHTML中)

我似乎不知道如何让代码在这两种情况下都工作。那么,我怎样才能有我的蛋糕并吃它呢


这是一个奇怪的问题,如果我解释得不够好,请告诉我,我会尽力澄清。提前谢谢。

我让它开始工作了。基本技巧是,如果表单提交成功,我将返回一个带有重定向状态代码和要重定向到的URL的基本响应对象,而不是返回重定向。然后我修改了我的
displayForm()
,以查找它,并在找到它时重定向

下面是从
Score()
函数中修改的代码:

if form.is_valid():
  form.save()
  messages.success(request, 'Score saved!')
  redirect = shortcuts.redirect('index')
  return http.HttpResponse(content=redirect['Location'],
                           status=redirect.status_code)
以及修改后的
displayForm()


为什么需要弹出表单?UI就是这样设置的。所有表单都会在内容上弹出,只是对于这个表单,我们实际上第一次需要验证。好的-当您向服务器发送帖子时,django将运行验证,然后显示有错误的表单(如果验证失败),我不确定您如何将其放入弹出窗口,因为您需要再次呈现表单模板。另一种方法是吃AjaxMixin——看看。谢谢@silviud。我之前阅读过这些文档,不幸的是,它们与我目前拥有的文档或多或少有相同之处(只是更优雅),例如,它们可以通过AJAX或定期提交,但不能同时提交一个或另一个,这取决于表单成功与否。幸运的是,我想我知道如何处理它,如果我能让它工作,我会给出一个答案。
if form.is_valid():
  form.save()
  messages.success(request, 'Score saved!')
  redirect = shortcuts.redirect('index')
  return http.HttpResponse(content=redirect['Location'],
                           status=redirect.status_code)
var displayForm = function(e) {
  var responseText = e.target.getResponseText();

  if (e.target.getStatus() == 302) {
    // If this was a redirect form submission, the response text will be the URL
    // to redirect to.
    window.location.href = responseText;
  } else {
    // Regular form submission.  Show the response text.
    goog.dom.getElement('popup-box').innerHTML = responseText;
  }
};