2010-04-12 70 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響應。