哇,這已經過了一年,因爲我看過這個線程。那麼,隨着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