2015-08-29 71 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

但即使表单有效并且数据保存在数据库中,成功功能也不会执行。你认为问题是什么? –