2010-04-12 69 views
15

我一直在找Django和jQuery。我在Django中构建了一个基本表单。在点击提交时,我使用jQuery向服务器发送一个AJAX请求来发布我的数据。这一点似乎工作正常,我已经设法保存数据。当表单无效时,Django返回一个ValidationError。任何人都可以告诉我如何返回这组错误消息作为对我的AJAX请求的响应,所以我可以轻松地使用JS迭代它并做任何事情?在Django中为AJAX请求返回表单错误

我找到了this snippet。看着JS位(processJson),你会发现他似乎通过从响应HTML中提取错误消息来获取错误消息。对我来说,这看起来有点不方便。这是最好的办法吗?

我对任何含糊不清的道歉。

在此先感谢。

回答

4

哇,这已经过了一年,因为我看过这个线程。那么,随着Django 1.3的出现和神奇的,未公开的基于类的视图,Django的视图相关功能变得越来越容易。我大量使用Django的基于类的通用CRUS视图的项目需要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包含三个字段 - message(其是人可读的消息),data(这是这种情况下将是形状误差的列表)和success(其是truefalse,分别表示请求是否成功)。这在jQuery客户端很容易处理。样本响应的样子:

Content-Type: application/json 

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

这只是我如何序列化的形式错误,JSON和基于类的通用视图实现的,但可以拆解与普通款式意见以及工作的例子。

1

当我使用前端验证时,通常响应包含可通过点符号(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 } 
}); 
+0

嗨加尔文, 什么被认为是一个错误,什么是成功?我应该返回一些价值吗? 在服务器端,如何将验证错误列表作为JSON返回,以便我可以使用错误函数在客户端列出它们? 这是让我困惑的一点。 谢谢。 – 2010-04-13 06:29:37

+0

成功就是如果你发送服务发回数据。成功之处在于你可以操纵数据并对数据进行操作(通常是更新字段或显示消息)。 错误是,如果服务返回致命错误(服务已损坏或某些东西已损坏)。通常你会返回false并且什么也不做,但是如果服务需要你的东西存在,你会告诉用户服务已经关闭。 事物的JSON端由您的后端服务处理。不幸的是,我的后端技能还不够,所以我不能告诉你如何编写这个服务。 – Calvin 2010-04-14 14:18:12

0

你可以使用我的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(); 

,并享受: - )

更多功能:http://adjax.hardysoftware.com.au/how/。我将在下周发布一个“1.0”版本,让我知道事情进展如何。谷歌代码项目在这里:http://code.google.com/p/django-adjax/

11

这个问题是旧的,但我认为最短的答案可能是在这样的视图中使用简单的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) 
+0

这工作。感谢震惊。我的印象是,你必须做一个“form.errors.as_ul()”或相当的JSON转储......但这样做效果更好。干杯。 – bento 2012-05-15 03:56:59

+0

当''jQuery.parseJSON(data)''时,我有第1行数据列t中的语法错误。我的数据以'Object {readyState:4,getResponseHeader:.aj ...'开头 – 2015-01-24 15:02:25

0

我知道这是一个老问题回答!仍然想贡献。我最喜欢的解决方案是使用装饰器来处理错误的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): 
    .... 

装饰器将捕捉任何未捕获的异常,并输出与错误信息和堆栈中的JSON。

我个人认为这是一个很好的解决方案,可以将django服务器混合html和json响应。