哇,我已经一年没看到这个帖子了。好吧,随着 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 并在基于类的通用视图中实现它的示例,但也可以将其与常规样式视图一起使用。