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
Jquery 在Django中返回AJAX请求的表单错误_Jquery_Ajax_Django_Django Forms - Fatal编程技术网

Jquery 在Django中返回AJAX请求的表单错误

Jquery 在Django中返回AJAX请求的表单错误,jquery,ajax,django,django-forms,Jquery,Ajax,Django,Django Forms,我一直在Django和jQuery周围寻找出路。我用Django构建了一个基本表单。单击submit,我使用jQuery向服务器发出AJAX请求,以发布我的数据。这一点似乎工作得很好,我已经设法保存了数据。当表单无效时,Django返回ValidationError。有谁能告诉我如何返回这组错误消息作为对AJAX请求的响应,这样我就可以使用JS轻松地遍历它并执行任何操作 我找到了这个片段。查看JS位(processJson),您将看到他似乎通过从响应HTML中提取错误消息来获取错误消息。这对我来

我一直在Django和jQuery周围寻找出路。我用Django构建了一个基本表单。单击submit,我使用jQuery向服务器发出AJAX请求,以发布我的数据。这一点似乎工作得很好,我已经设法保存了数据。当表单无效时,Django返回ValidationError。有谁能告诉我如何返回这组错误消息作为对AJAX请求的响应,这样我就可以使用JS轻松地遍历它并执行任何操作

我找到了这个片段。查看JS位(processJson),您将看到他似乎通过从响应HTML中提取错误消息来获取错误消息。这对我来说似乎有点笨拙。这是最好的方法吗

我为我的含糊不清表示歉意


提前感谢。

当我使用前端验证时,通常响应包含可以通过点表示法访问的块(dataReturned.specificData)

基于返回数据的内容和方式是访问数据的关键。处理返回的数据越模块化,访问就越容易

// Start ajax request to server
$.ajax({
    url: '/path_to_service',
    type: 'POST',
    data: { key: value },

    // Do something with the data
    success: function(data) {
        // Data is everything that is returned from the post
        alert(data);
        // data.message could be a piece of the entire return
        alert(data.message);
    } error: function(data) { // Handle fatal errors }
});

您可以使用我的adjax库为您处理此问题。在路径上的某个位置安装应用程序,链接
adjax.js
文件,并将以下内容添加到视图中:

import adjax
@adjax.adjax_response
def my_view(request):
    # prepare my_form with posted data as normal
    adjax.form(request, my_form)
加载
adjax.js
文件后使用javascript启用表单:

 $('form').adjaxify();
并享受:-)


此处有更多功能:。下周我将发布一个“1.0”版本,让我知道进展如何。谷歌代码项目在这里:

哇,我已经有一年没有看到这个帖子了。随着Django 1.3和神奇的、未记录的基于类的视图的出现,扩展Django的视图相关功能变得更加容易。我的项目大量使用Django基于类的通用CRU视图,需要AJAX和JSON功能。我添加了一个示例,说明如何修改Django的更新视图以支持AJAX并以JSON格式返回AJAX响应。看看:

def errors_to_json(errors):
    """
    Convert a Form error list to JSON::
    """
    return dict(
            (k, map(unicode, v))
            for (k,v) in errors.iteritems()
        )

class HybridUpdateView(UpdateView):
    """
    Custom update generic view that speaks JSON
    """
    def form_valid(self, form, *args, **kwargs):
        """
        The Form is valid
        """
        form.save()

        self.message = _("Validation passed. Form Saved.")
        self.data = None
        self.success = True

        payload = {'success': self.success, 'message': self.message, 'data':self.data}

        if self.request.is_ajax():
            return HttpResponse(json.dumps(payload),
                content_type='application/json',
            )
        else:
            return super(HybridUpdateView, self).form_valid(
                form, *args, **kwargs
            )

    def form_invalid(self, form, *args, **kwargs):
        """
        The Form is invalid
        """
        #form.save()

        self.message = _("Validation failed.")
        self.data = errors_to_json(form.errors)
        self.success = False

        payload = {'success': self.success, 'message': self.message, 'data':self.data}

        if self.request.is_ajax():
            return HttpResponse(json.dumps(payload),
                content_type='application/json',
            )
        else:
            return super(HybridUpdateView, self).form_invalid(
                form, *args, **kwargs
            )
响应JSON包含三个字段—
消息
(这是一条人类可读的消息)、
数据
(这种情况下是表单错误列表)和
成功
(这是
,分别指示请求是否成功)。这在jQuery客户端中非常容易处理。示例响应如下所示:

Content-Type: application/json

{"message": "Validation failed.", "data": {"host": ["This field is required."]}, "success": false}

这只是我将表单错误序列化为JSON并在基于类的泛型视图中实现它的一个示例,但也可以将其分解为常规样式视图。

这个问题很老,但我认为最简单的答案可能是在这样的视图中使用简单的JSON

from django.utils import simplejson

def ajax(request):
    if request.method == 'POST':
        form = someForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponse(something)
        else:
            errors = form.errors
            return HttpResponse(simplejson.dumps(errors))
    else:
        return HttpResponse(something)
现在您可以像上面描述的Calvin一样访问jquery中的数据。 Jquery使处理数据变得很容易,您可以这样做:

var errors = jQuery.parseJSON(data)
    alert(errors.username)

我知道这是一个老生常谈的问题!我仍然想贡献自己的力量。我最喜欢的解决方案是对应该出错的json方法使用装饰器

import traceback,sys,simplejson

def unhandled(e):
  """
     Helper function to format an exception and it's stack
  """
  exc_type, exc_value, exc_traceback = sys.exc_info()
  lines = traceback.format_exception(exc_type, exc_value, exc_traceback)
  stack =  ''.join(line for line in lines)
  return HttpResponse(simplejson.dumps({"error":-1, "response": e.message ,"stack":stack}), content_type='application/json')


def use_json_except(f):
  def new_f(*args):
    try:
      return f(*args)
    except Exception as e:
      return unhandled(e)
    return new_f
然后定义Django方法:

 @use_json_except
 def add_annotation(request):
     ....
decorator将捕获任何未捕获的异常,并输出带有错误信息和堆栈的json


我个人认为,对于混合html和json响应的django服务器来说,这是一个非常好的解决方案。

嗨,Calvin,什么是错误,什么是成功?我是否应该返回一些值?在服务器端,如何将验证错误列表返回为JSON,以便使用error函数在客户端列出它们?这是让我困惑的一点。谢谢。如果您发送的服务返回数据,则成功。成功时,您将操作数据并对其进行处理(通常是更新字段或显示消息)。错误是指服务返回致命错误(服务已损坏或某些内容已损坏)。通常,您会返回false,并且什么也不做,但是如果您的东西需要服务才能存在,您会告诉用户服务已关闭。JSON方面的事情由后端服务处理。不幸的是,我的后端技能不太好,因此我无法告诉您如何编写服务。这很有效。谢谢,杰瑞德。我的印象是,您必须执行json转储“form.errors.as_ul()”或等效的。。。但这更有效。干杯。当
jQuery.parseJSON(data)
时,数据中第1行第t列出现语法错误。我的数据以
对象{readyState:4,getResponseHeader:.aj…