Jquery 在Django中返回AJAX请求的表单错误
我一直在Django和jQuery周围寻找出路。我用Django构建了一个基本表单。单击submit,我使用jQuery向服务器发出AJAX请求,以发布我的数据。这一点似乎工作得很好,我已经设法保存了数据。当表单无效时,Django返回ValidationError。有谁能告诉我如何返回这组错误消息作为对AJAX请求的响应,这样我就可以使用JS轻松地遍历它并执行任何操作 我找到了这个片段。查看JS位(processJson),您将看到他似乎通过从响应HTML中提取错误消息来获取错误消息。这对我来说似乎有点笨拙。这是最好的方法吗 我为我的含糊不清表示歉意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中提取错误消息来获取错误消息。这对我来
提前感谢。当我使用前端验证时,通常响应包含可以通过点表示法访问的块(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…