2015-08-29 99 views
0

我有一個名爲Item的模型,我試圖用Ajax創建項目,一切看起來都工作正常,但我得到並在過程結束時出錯,在Ajax中的成功功能。我一直在閱讀了很多答案的問題,問題是在StackOverflow的,但我不能讓它工作:返回數據中的Django + Ajax錯誤

這是我的模型:

PRIORITY_CHOICES = (
(1, 'Low'), 
(2, 'Normal'), 
(3, 'High'), 
) 

class Item(models.Model): 
name = models.CharField(max_length=60) 
description = models.TextField(max_length=1000) 
created = models.DateTimeField(auto_now_add=True) 
priority = models.IntegerField(choices=PRIORITY_CHOICES, default=1) 
done = models.BooleanField(default=False) 
meeting = models.ForeignKey(Meeting) 

def __str__(self): 
    return self.name 

這是我的看法,偉馳好的工作和保存數據到數據庫中去:

from .forms import AddItemForm 
from .utils import render_to_json_response 

class AjaxFormResponseMixin(object): 
    def form_invalid(self, form): 
     return render_to_json_response(form.errors, status=400) 

    def form_valid(self, form): 

     # save 
     self.object = form.save() 

     # initialize an empty context 
     context = {} 

     # return the context as json 
     return render_to_json_response(self.get_context_data(context)) 

class AjaxItemCreateView(AjaxFormResponseMixin, CreateView): 
    form_class = AddItemForm 

    def get_context_data(self, context): 
     context['success'] = True 
     context['name'] = self.object.name 
     context['description'] = self.object.description 
     return context 

,你可以看到,我使用了一個名爲render_to_json_response自定義快捷鍵,以用JSON

解析數據,這是代碼快捷方式(請注意,我打印的背景下,爲了驗證數據):

from django.http import JsonResponse 

def render_to_json_response(context, **response_kwargs): 
    print (context) 
    return JsonResponse(context) 

(如果你想知道爲什麼我使用這個簡單的快捷鍵是因爲以前我是想返回與HttpResponse對象,並指定CONTENT_TYPE =「應用/ JSON」響應,但也有人不工作)

這是我的Ajax代碼:

function AddItem(event){ 
var csrftoken = getCookie('csrftoken'); 
var item_name = $('#item-name').val(); 
var item_desription = $('#item-description').val(); 
var item_priority = $('#item-priority').val(); 
var item_meeting_pk = $('#item-meeting-pk').val(); 
var url = "/item/add/"; 
$.ajax({ 
    type: "POST", 
    url: url, 
    data: { 
     'name': item_name, 
     'description': item_desription, 
     'priority': item_priority, 
     'meeting': item_meeting_pk , 
     'csrfmiddlewaretoken': csrftoken 
    }, 
    success: function(data){ 
    alert("success"); 
    alert(data); 
    }, 
    complete: function(data){ 
    alert("completed"); 
    alert(JSON.stringify(data)); 
    } 
}); 
} 

,最後,這是調用形式AddItem()函數:

<form> 
    {% csrf_token %} 
    <input type="text" placeholder="Nombre del item" id='item-name'/> 
    <input type="text" placeholder="Descripción del item" id='item-description'/> 
    <select id="item-priority" name="provider" class="form-control"> 
     <option value="1">Baja</option> 
     <option value="2">Normal</option> 
     <option value="3">Alta</option> 
    </select> 
    <input type='hidden' id='item-meeting-pk' value='{{ meeting.pk }}'> 
    <button onclick='AddItem()' class="button-blue" >Agregar</button> 
    </form> 

當我提交表單,一切順利,在我的Django的殼,我可以看到POST請求返回200和數據確定打印:

{'name': 'asdkkasd', 'description': 'sdksdksjd', 'success': True} 
[29/Aug/2015 08:34:22]"POST /item/add/ HTTP/1.1" 200 65 
在AJAX功能我

在成功和完整的JavaScript警告,但只有完整的一個是執行,這就是我與警報的執行(JSON.stringify(數據));:

{"readyState": 0, "responseText":"", "status":0, "statusText": "error"} 

我希望你能得到幫助我,謝謝你:)

回答

0

有成功和正在使用的AJAX功能的全功能之間的區別...

success 

它被調用上的200(OK)的響應。

complete 

這將被始終調用,以及名稱暗示請求確實成功,即使是在服務器端或OK響應失敗。它只是成功(即:登陸你的服務器,並帶回你的客戶端提供的東西(瀏覽器,移動任何)。所以這是完全的方法。

你可以取消這種方法,只能使用成功,如果不需要否則。

欲瞭解更多信息。Read here

FYI:

readyState的輸出,你說表現出0,因此要求不initialized.It應該是完整的要求是4。

+0

確切地說,在響應200上調用成功,並且正如你在我的django服務器中看到POST請求返回200,但成功函數沒有執行 –

+0

一個non- 200響應更可能是導致此行爲的原因。檢查服務器代碼返回的狀態是什麼。在那裏有一個打印語句。 – cafebabe1991

+0

好吧,我看到你有200迴應。 – cafebabe1991

1

你的表格幾乎肯定是無效的;那麼你會從form_invalid返回一個400的狀態,這會觸發jQuery調用failure函數(如果有),而不是success

不幸的是,在這種情況下,您不能使用適當的RESTful狀態碼。一個無效的表單提交仍然應該返回200.

+0

但即使表單有效並且數據保存在數據庫中,成功功能也不會執行。你認爲問題是什麼? –