哇,这已经过了一年,因为我看过这个线程。那么,随着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
(其是true
或false
,分别表示请求是否成功)。这在jQuery客户端很容易处理。样本响应的样子:
Content-Type: application/json
{"message": "Validation failed.", "data": {"host": ["This field is required."]}, "success": false}
这只是我如何序列化的形式错误,JSON和基于类的通用视图实现的,但可以拆解与普通款式意见以及工作的例子。
嗨加尔文, 什么被认为是一个错误,什么是成功?我应该返回一些价值吗? 在服务器端,如何将验证错误列表作为JSON返回,以便我可以使用错误函数在客户端列出它们? 这是让我困惑的一点。 谢谢。 – 2010-04-13 06:29:37
成功就是如果你发送服务发回数据。成功之处在于你可以操纵数据并对数据进行操作(通常是更新字段或显示消息)。 错误是,如果服务返回致命错误(服务已损坏或某些东西已损坏)。通常你会返回false并且什么也不做,但是如果服务需要你的东西存在,你会告诉用户服务已经关闭。 事物的JSON端由您的后端服务处理。不幸的是,我的后端技能还不够,所以我不能告诉你如何编写这个服务。 – Calvin 2010-04-14 14:18:12