我有一个名为Item的模型,我正在尝试使用Ajax创建Items,一切看起来都正常,但是在Ajax的成功函数中,我在进程结束时遇到错误。我在StackOverflow中已经阅读了很多这样的问题的答案,但是我无法使它工作:
这是我的模特:
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 =“application / 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 shell中,我可以看到post请求返回200并且数据打印正常:
{'name': 'asdkkasd', 'description': 'sdksdksjd', 'success': True}
[29/Aug/2015 08:34:22]"POST /item/add/ HTTP/1.1" 200 65
在ajax函数中我在成功和完成时都有javascript警报,但只有完整的一个正在执行,这就是我通过执行alert(JSON.stringify(data))得到的;:
{"readyState": 0, "responseText":"", "status":0, "statusText": "error"}
我希望你能帮助我,谢谢你:)。
答案 0 :(得分:1)
您的表格几乎肯定无效;在这种情况下,您从form_invalid
返回400状态,这会触发jQuery调用failure
函数(如果有),而不是success
。
不幸的是,在这种情况下,您无法使用正确的RESTful状态代码。无效的表单提交仍应返回200。
答案 1 :(得分:0)
您正在使用的ajax功能的成功与完整功能之间存在差异......
success
在200(OK)的响应中调用它。
complete
这将始终被调用,正如名称暗示请求确实成功,即使服务器端出现故障或OK响应也是如此。它刚刚成功(即:登陆你的服务器并带回一些东西回到你的客户端(浏览器,手机等)。那就是完整的方法。
您可以取消此方法,只有在不需要的情况下才能成功使用。
了解更多信息。 Read here
仅供参考:
您显示的readystate输出为0,因此请求未初始化。请求完成时应为4。